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

eus*_*h77 1 bash shell stdin newline

阅读了Bash的这个功能的以下描述(摘自手册页):

这里的弦乐

这里文档的一个变体,格式是:

<<<word
Run Code Online (Sandbox Code Playgroud)

该字被扩展并在其标准输入上提供给命令.

我期望这里对字符串的解释是Bash只是直接在命令的标准输入上传递变量的内容,未经修改.遵循这个逻辑,线[1][2]下面的线将是有效的.

[1]~$ printf foo | cat - <(echo end)
fooend
[2]~$ cat - <(echo end) <<<foo
foo
end
Run Code Online (Sandbox Code Playgroud)

但是,Bash在"扩展"字符串时添加了换行符,这是我没想到的.即使变量以换行符本身结束,也会发生这种情况:

[3]~$ printf "foo\n" | cat - <(echo end)
foo
end
[4]~$ cat - <(echo end) <<<foo$'\n'
foo

end
Run Code Online (Sandbox Code Playgroud)

测试在4.2.25和4.3.30.

所以我的问题是:这个行为是在Bash docs中的任何地方指定的吗?我可以在脚本中依赖它吗?

che*_*ner 5

不是确定的,但我相信这里的字符串意图相当于这里的单行文档,所以

cat <<< foo
Run Code Online (Sandbox Code Playgroud)

cat <<EOF
foo
EOF
Run Code Online (Sandbox Code Playgroud)

是等价的.由于here文档总是以换行符结束,因此字符串也应如此.


考虑这个字符串的简单用例:

IFS=: read foo bar <<< "a:b"
# foo=a
# bar=b
Run Code Online (Sandbox Code Playgroud)

如果here字符串未提供换行符,则退出状态为read1.(参见printf "foo" | { read; echo $?; }vs.printf "foo\n" | { read; echo $?; })