Echo Stdin 混乱

Echo Stdin confusion

我创建了两个文件,即 file1.txt 和 file2.txt。 当我写

echo < file1.txt

它returns 是一个空行。但是 cat < file1.txt returns 的内容 file1.txt.

既然 echo 打印发送给它的任何内容,为什么 echo 不打印 file1.txt 的内容?

这是重复的并且已经解决:https://unix.stackexchange.com/questions/63658/redirecting-the-content-of-a-file-to-the-command-echo

您可以将所有内容重定向到 echo,但它不会对其执行任何操作。 echo 不读取其标准输入。它所做的只是将其参数写入标准输出,参数由 space 字符分隔并以换行符终止(并且一些 echo 实现中有一些转义序列扩展 and/or 参数以- 可能被视为选项)。

如果您希望 echo 显示文件的内容,您必须将该内容作为参数传递给 echo。类似于:

echo "$(cat my_file.txt)"

请注意,$(...) 从该 cat 命令的输出中去除了尾随的换行符,并且 echo 添加了 一个

另请注意,除了 zsh,您不能在命令的参数中传递 NUL 字符,因此上述命令通常不适用于二进制文件。 yash 还将删除不属于有效字符的字节。

如果想要这样做的原因是因为您希望 echo 扩展文件中的 \n\b51... 转义序列(作为符合 UNIX 的 echo 实现,但不是全部),那么您宁愿使用 printf 代替:

printf '%b\n' "$(cat my_file.txt)"

echo相反,后者是可移植的,如果文件内容以-开头,不会有问题。