阅读了Bash的这个特性的以下描述(摘自手册页):
此处字符串
此处文件的变体,格式为:
<<<word
单词被扩展并在其标准输入上提供给命令。
我希望这里对字符串的解释是Bash只是直接在命令的标准输入上传递变量的内容,未经修改。遵循此逻辑,下面的行[1]
和[2]
实际上是等效的。
[1]~$ printf foo | cat - <(echo end)
fooend
[2]~$ cat - <(echo end) <<<foo
foo
end
然而,Bash在“扩展”字符串时添加了换行符,这是我没想到的。即使变量以换行符本身结束,也会发生这种情况:
[3]~$ printf "foo\n" | cat - <(echo end)
foo
end
[4]~$ cat - <(echo end) <<<foo$'\n'
foo
end
在4.2.25和4.3.30中测试。
所以我的问题是:这个行为是否在Bash docs中指定了?我可以在脚本中依赖它吗?
答案 0 :(得分:5)
不是确定的,但我相信这里的字符串意图相当于这里的单行文档,所以
cat <<< foo
和
cat <<EOF
foo
EOF
是等价的。由于here文档总是以换行符结束,因此字符串也应如此。
考虑这个字符串的简单用例:
IFS=: read foo bar <<< "a:b"
# foo=a
# bar=b
如果此字符串未提供换行符,则read
的退出状态将为1.(请参阅printf "foo" | { read; echo $?; }
vs printf "foo\n" | { read; echo $?; }
。)
答案 1 :(得分:2)
所以我的问题是:这个行为是否在Bash docs中指定了? 我可以在脚本中依赖它吗?
规范现已添加到Bash Reference Manual:
结果作为单个字符串提供,并附加换行符 标准输入上的命令(或文件描述符 n ,如果 n 是 指定)。