[注意:这个类似的 Q涉及相同的 bash 错误消息。它被标记为另一个 Q的副本。但是因为我发现这个错误的来源非常不同,我将在下面回答我自己的问题。]
这个以前工作的 bash 脚本行
while ... do ... done <<< "$foo"
Run Code Online (Sandbox Code Playgroud)
有一天开始产生此错误消息:
无法为此处文档创建临时文件:权限被拒绝
使用bash -c 'some command'
过度使用有什么真正的好处bash <<< 'some command'
他们似乎达到了同样的效果。
偶然地,我发现这wc
取决于它如何从 bash 获取输入的不同:
$ s='hello'
$ wc -m <<<"$s"
6
$ wc -c <<<"$s"
6
$ printf '%s' "$s" | wc -m
5
$ printf '%s' "$s" | wc -c
5
Run Code Online (Sandbox Code Playgroud)
这是 - 恕我直言令人困惑 - 行为记录在某处吗?wc
这里算什么- 这是一个假定的换行符吗?
我创建了一个带有制表符分隔字段的文件。
echo foo$'\t'bar$'\t'baz$'\n'foo$'\t'bar$'\t'baz > input
Run Code Online (Sandbox Code Playgroud)
我有以下脚本命名 zsh.sh
#!/usr/bin/env zsh
while read line; do
<<<$line cut -f 2
done < "$1"
Run Code Online (Sandbox Code Playgroud)
我测试一下。
$ ./zsh.sh input
bar
bar
Run Code Online (Sandbox Code Playgroud)
这工作正常。但是,当我将第一行更改为调用时bash
,它失败了。
$ ./bash.sh input
foo bar baz
foo bar baz
Run Code Online (Sandbox Code Playgroud)
为什么这会失败并bash
与 一起使用zsh
?
env
产生相同的行为。echo
而不是使用 here-string<<<$line
也会产生相同的行为。即echo $line | cut -f 2
。awk
而不是cut
适用于两个外壳。即<<<$line awk '{print $2}'
。在 bash 中,在我看来,此处的文档和此处的字符串都可用于提供字符串作为标准输入输入。这里的文档可能会提供额外的功能来指定分隔符,我不确定在任何情况下是否有必要。
他们的目的有什么区别?一个总是可以在另一个使用的地方使用吗?我们什么时候使用哪个?谢谢。
请注意:
$ diff <(echo a) <<<b
diff: missing operand after '/dev/fd/63'
diff: Try 'diff --help' for more information.
Run Code Online (Sandbox Code Playgroud)
我知道<(...)
效果很好:
$ diff <(echo a) <(echo b)
1c1
< a
---
> b
Run Code Online (Sandbox Code Playgroud)
我也知道<<<
一般情况下效果很好:
$ cat <<<a
a
Run Code Online (Sandbox Code Playgroud)
那么正确的调用方法是什么diff
?
我想从 ksh 脚本中 3 个不同变量的变量中提取 3 个单词。我在 ksh93 上使用了这条线,效果很好:
read A B C <<< $line
在 ksh88 上运行上述命令时出现此错误:
syntax error at line ## : '<' unexpected
如何在 ksh88 上执行相同的操作?
如果要将系统命令的单行输出读入 Bash shell 变量,则至少有两个选项,如下例所示:
IFS=: read user x1 uid gid x2 home shell <<<$(grep :root: /etc/passwd | head -n1)
和
IFS=: read user x1 uid gid x2 home shell < <(grep :root: /etc/passwd | head -n1)
这两者有什么区别吗?什么更有效或推荐?
请注意,阅读/etc/passwd
文件只是为了举例。我的问题的重点是这里的字符串与过程替换。
当我使用该命令时,cat <<< Hey > text.txt text.txt
我希望它在文件 text.txt 中写入“嘿”,然后显示该文件。但是没有输出。bash 实际上是如何解释它的?
命令及其输出:
$ cat <<< Hey > text.txt text.txt
$ cat text.txt
$
Run Code Online (Sandbox Code Playgroud) 我有 $a 和 $b。我想跑diff
那些。
我想出的最好的是:
diff <(cat <<<"$a") <(cat <<<"$b")
Run Code Online (Sandbox Code Playgroud)
但我觉得我缺少一个聪明的 Bash 语法来做到这一点(如“你为什么不只使用 foo?”)。
here-string ×10
bash ×8
cat ×1
diff ×1
ksh ×1
linux ×1
newlines ×1
permissions ×1
quoting ×1
wc ×1
whitespace ×1
zsh ×1