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,就好像它是由用户作为输入提供的一样。这两者之间唯一的区别是 $() 可以递归,而 `` 不能递归。
正如所说,
如果要
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)
| 归档时间: |
|
| 查看次数: |
280290 次 |
| 最近记录: |