如果我有包含以下内容的文件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