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


24

如果我的文件input.txt包含:

hello
world
!

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

hello world !

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

Answers:


32

如果您使用

echo "$(cat input.txt)"

它会正常工作。

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


真好!那么$()和反引号之间有什么区别(如果有)?(对不起,如果太切线)
Chan-Ho Suh 2012年

它们等效,除了$(...)更易于嵌套的事实。在这两种情况下,如果不引用结果,它将被标记为空格上的多个参数。
詹姆斯·亨斯特里奇

3
但是,即使在双引号中也省略了最后的换行符。相比之下,Perl的反引号运算符扩展到命令的整个输出,包括所有换行符。
基思·汤普森

6
@KeithThompson是的,命令替换将从输出中删除所有尾随的换行符。这样做的好处是,例如echo "$(date) something"从日期的输出中删除尾随的换行符,使回显在同一行上输出日期和“某物”。如果您需要“按原样”存储文件或命令输出,请使用mapfile(help mapfileread -rd ''或while读取循环。
geirha

谢谢大家:-)我从这里的每条评论中学到了一些东西!
Chan-Ho Suh 2012年

2

引用bash手册页的第Command Substitution

嵌入的换行符不会被删除,但是可以在分词时将其删除。

再进一步,同一部分:

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

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

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

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

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


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.