Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Bash在这里扩展字符串时总是添加换行符?_Bash_Shell_Newline_Stdin - Fatal编程技术网

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

为什么Bash在这里扩展字符串时总是添加换行符?,bash,shell,newline,stdin,Bash,Shell,Newline,Stdin,阅读了以下关于Bash此功能的描述(摘自手册页): 这里是字符串 此处文件的一个变体,格式为: <<<word 然而,Bash在“扩展”字符串时添加了一个新行,这是我没有预料到的。即使变量以换行符结束,也会发生这种情况: [3]~$ printf "foo\n" | cat - <(echo end) foo end [4]~$ cat - <(echo end) <<<foo$'\n' foo end [3]~$printf“foo\n”|

阅读了以下关于Bash此功能的描述(摘自手册页):

这里是字符串

此处文件的一个变体,格式为:

<<<word
然而,Bash在“扩展”字符串时添加了一个新行,这是我没有预料到的。即使变量以换行符结束,也会发生这种情况:

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

end

[3]~$printf“foo\n”| cat-不是确定的,但我认为here字符串旨在等效于一行here文档,以便

cat <<< foo
cat
所以我的问题是:在Bash文档中是否指定了这种行为?
我可以在脚本中依赖它吗

该规范现已添加到:

结果以单个字符串的形式提供,并附加一个换行符 其标准输入上的命令(或文件描述符n,如果n为 指定)


在UNIX中,文件或流需要换行才能成为有效的文本文件内容<代码>读取
失败(在has-a-nonzero-exit-status感测中),没有它们;当输入上的换行符丢失时,多个标准UNIX工具具有未定义的行为。在以后的版本中,您绝对不会看到这种变化。@charlesduff没有考虑过,谢谢。但是,并不是每个工具都能在文本文件上工作(
wc-c
md5sum
),因此在一般情况下,命令的stdin不需要是有效的文本文件。此外,Bash并不总是添加换行符(参见文章中的示例),因此仅此论点无法解释太多。Chepner关于herestrings作为一行heredocs的语法糖的历史背景是准确的……也就是说,我没有看到问题中的任何示例与我的解释相反。在
printf
的情况下,您请求显式控制,这是一种非常明显的情况;在
cat
的情况下,bash无法控制子命令输出的内容,也无法查看它——因此,即使需要,它也无法查看是否已经有一个尾随换行符来添加缺少的换行符@然而,CharlesDuffy,Bash是扩展
的人,谢谢!这似乎是最合理的解释。
cat <<< foo
cat <<EOF
foo
EOF
IFS=: read foo bar <<< "a:b"
# foo=a
# bar=b