为什么 bash 会删除 $(cat file) 中的 \n?

为什么 bash 会删除 $(cat file) 中的 \n?

如果我有包含以下内容的文件input.txt

hello
world
!

然后执行 bash 命令echo $(cat input.txt)将输出以下内容:

hello world !

为什么以及如何修复它以准确输出文件中的内容?

答案1

如果你使用

echo "$(cat input.txt)"

它将正常工作。

大概echo 的输入以换行符分隔,它会将其作为单独的命令处理,因此结果将没有换行符。

答案2

摘自 bash 手册页,部分内容Command Substitution

嵌入的换行符不会被删除,但它们可能会在分词期间被删除。

再往前走一点,是同一部分:

如果替换出现在双引号内,则不会对结果执行单词拆分和路径名扩展。

这就是为什么echo "$(cat /etc/passwd)" 有效。

此外,还应该注意,命令替换根据 POSIX 规范删除尾随的换行符:

$ echo "$(printf "one\ntwo\n\n\n")"
one
two

因此,通过输出文件$(cat file.txt)可能会导致尾随换行符的丢失,如果整个文件完整性是优先考虑的,那么这可能会成为问题。

答案3

您可以保留换行符,例如通过将 IFS 设置为空:

$ IFS=
$ a=$(cat links.txt)
$ echo "$a"
link1
link2
link3

相关内容