为什么bash在$(cat文件)中删除\ n?

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

 hello world ! 

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

 hello world ! 

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

如果你使用

 echo "$(cat input.txt)" 

它会正常工作。

可能 echo的输入由换行符分隔,并且它将作为单独的命令处理它,因此结果将没有换行符。

引用bash手册页, Command Substitution部分:

嵌入的换行不会被删除,但在分词时可能会被删除。

更进一步,相同的部分:

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

这就是echo "$(cat /etc/passwd)"作用原因。

另外,应该知道, POSIX规范的命令替换会删除尾随换行符:

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

因此,通过$(cat file.txt)输出文件可能会导致丢失尾随换行符,如果整个文件完整性是优先级,则可能会出现问题。