为什么Bash在扩展字符串时总是添加换行符?

时间:2015-10-20 19:47:30

标签: bash shell newline stdin

阅读了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中指定了?我可以在脚本中依赖它吗?

2 个答案:

答案 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 是   指定)。