将文件内容重定向到命令“echo”

dan*_*bcn 66 shell io-redirection echo

我有一个名为my_file.txt的文件,其内容只是 string Hello。如何将其内容重定向到命令echo?

我知道我有命令less, cat, more... 但我需要用echo.

我试过这个:

$ cat my_file.txt | echo
Run Code Online (Sandbox Code Playgroud)

还有这个:

$ echo < my_file.txt
Run Code Online (Sandbox Code Playgroud)

但在这两种情况下,它在标准输出中只出现一个空白,而不是 my_file.txt 的内容。

我怎么能那样做?

Sté*_*las 83

您可以重定向所有您想要的内容, echo但它不会对它做任何事情。echo不读取其标准输入。它所做的只是将其参数写入标准输出,由空格字符分隔并以换行符终止(并且在某些echo实现中扩展了一些转义序列和/或以-可能被视为选项开头的参数)。

如果要echo显示文件的内容,则必须将该内容作为参数传递给echo. 就像是:

echo "$(cat my_file.txt)"
Run Code Online (Sandbox Code Playgroud)

请注意,从该命令的输出中$(...)去除尾随的换行符scat,然后再echo添加一个。

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

如果想这样做的原因是因为你要echo扩大\n,\b,\0351...在文件中转义序列(如UNIX符合的echo实现方式做,但不是所有的),那么你宁愿使用printf,而不是:

printf '%b\n' "$(cat my_file.txt)"
Run Code Online (Sandbox Code Playgroud)

与 . 相反echo,它是可移植的,如果文件的内容以-.


作为替代$(cat file),与ksh,zsh和bash,一个也可以这样做:$(<file)。这是一个特殊的操作符,shell借此而不是cat读取文件的内容来组成扩展。它仍然去除尾随的换行符并扼杀 NUL 字节,除了 in zsh。在 中bash,这仍然会产生一个额外的进程。另请注意,一个区别是,如果尝试以这种方式读取类型为 directory 的文件,则不会出现任何错误。此外,虽然$(< file)是特殊的,但$(< file; other command)不是(在zsh,当不模拟其他外壳时,仍然会file通过运行隐式 $READNULLCMD命令(通常是寻呼机)来扩展 的内容)。


Gyp*_*aut 10

添加到其他答案,您还可以尝试输入重定向而不是 cat

echo $(<my_file.txt)
Run Code Online (Sandbox Code Playgroud)

或者

echo `<my_file.txt`
Run Code Online (Sandbox Code Playgroud)

$()和`` 执行相同的操作,它们在其作用域内运行命令并将输出提供给shell,就好像它是由用户作为输入提供的一样。这两者之间唯一的区别是 $() 可以递归,而 `` 不能递归。

  • `\`...\`` 可以是递归的,但语法更加尴尬。您还必须注意其中的反斜杠(甚至在单引号内),以及“”(如果被引用)。在任何情况下使用任一语法,它们都应该在列表上下文中被引用,除非您希望将 split+glob 应用于它们。请注意,“$(&lt;file)”是非标准 ksh 扩展(在 bash 和 zsh 中也可用) (2认同)

ken*_*chi 6

正如所说,

如果要echo显示文件的内容,则必须将该内容作为参数传递给echo

例如,您可以这样做xargs(考虑到您需要启用反斜杠转义的解释):

$ cat my_file.txt | xargs echo -e
Run Code Online (Sandbox Code Playgroud)

或者只是你所问的(没有转义序列的解释):

$ cat my_file.txt | xargs echo
Run Code Online (Sandbox Code Playgroud)