您可以重定向所有想要的内容, echo
但是它不会做任何事情。echo
不读取其标准输入。它所做的全部工作就是将其参数以空格字符分隔并以换行符终止的方式写入标准输出(并且在其中一些echo
实现中带有一些转义序列,并且/或者以-
可能被视为选项的参数开头)。
如果要echo
显示文件的内容,则必须将该内容作为参数传递给echo
。就像是:
echo "$(cat my_file.txt)"
请注意,该命令的输出$(...)
中将除去尾随换行符scat
,并向后echo
添加一个。
另请注意,除了使用之外zsh
,您不能在命令的参数中传递NUL字符,因此上述操作通常不适用于二进制文件。yash
还将删除不构成有效字符一部分的字节。
如果想这样做的原因是因为你要echo
扩大\n
,\b
,\0351
...在文件中转义序列(如UNIX符合的echo
实现方式做,但不是所有的),那么你宁愿使用printf
,而不是:
printf '%b\n' "$(cat my_file.txt)"
与此相反echo
,该文件是可移植的,如果文件内容以开头,则不会出现问题-
。
作为替代$(cat file)
,与ksh
,zsh
和bash
,一个也可以这样做:$(<file)
。那是一个特殊的运算符,通过该运算符,shell(而不是shell)cat
读取文件的内容来构成扩展。它仍然会删除NUL字节上的尾随换行符和扼流圈,除外zsh
。在中bash
,仍然需要进行额外的处理。另请注意,一个区别是,如果尝试以这种方式读取目录类型的文件,则不会出现任何错误。另外,虽然$(< file)
很特别,但$(< file; other command)
不是(在中zsh
,当不模拟其他shell时file
,通过运行隐式 $READNULLCMD
命令(通常是寻呼机),它仍将扩展的内容)。
echo
?