eus*_*h77 1 bash shell stdin newline
阅读了Bash的这个功能的以下描述(摘自手册页):
这里的弦乐
这里文档的一个变体,格式是:
Run Code Online (Sandbox Code Playgroud)<<<word该字被扩展并在其标准输入上提供给命令.
我期望这里对字符串的解释是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中的任何地方指定的吗?我可以在脚本中依赖它吗?
不是确定的,但我相信这里的字符串意图相当于这里的单行文档,所以
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 $?; })
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |