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


41

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

我知道我有命令lesscatmore...但我需要做它用echo

我尝试了这个:

$ cat my_file.txt | echo

还有这个:

$ echo < my_file.txt

但是在两种情况下,它在标准输出中仅显示为空白,而my_file.txt的内容中则没有。

我该怎么办?


7
您为什么坚持使用echo
凯文

7
@Kevin,大概他最终想扩展文件中的ANSI C转义序列(\nb...),这将是echo(至少是标准echo)的有效用法。或者大概是他想了解为什么它不能那样工作。无论如何,没有理由不赞成IMO。
斯特凡Chazelas

3
我来这里是因为我很好奇为什么回声<file.txt时为什么它不起作用。SE似乎有一个合理的问题,答案非常有帮助。向我+1。
Neuronet

Answers:


53

您可以重定向所有想要的内容, 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)kshzshbash,一个也可以这样做:$(<file)。那是一个特殊的运算符,通过该运算符,shell(而不是shell)cat读取文件的内容来构成扩展。它仍然会删除NUL字节上的尾随换行符和扼流圈,除外zsh。在中bash,仍然需要进行额外的处理。另请注意,一个区别是,如果尝试以这种方式读取目录类型的文件,则不会出现任何错误。另外,虽然$(< file)很特别,但$(< file; other command)不是(在中zsh,当不模拟其他shell时file,通过运行隐式 $READNULLCMD命令(通常是寻呼机),它仍将扩展的内容)。


3
在bash和zsh中,您都可以跳过,cat而让Shell直接读取它:echo "$(<my_file.txt)"
凯文

1
是的,可以使用kshzshbash$(<filename)
Dimitre Radoulov

非常感谢您,这就是我所需要的,而且效果很好!:-)
danielmbcn

@Kevin,Dimitre,现在添加。
斯特凡Chazelas

4

除了其他答案外,您还可以尝试使用输入重定向来代替 cat

echo $(<my_file.txt)

要么

echo `<my_file.txt`

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


2

简单的答案:你不能。echo(无论是内置的shell还是常规的二进制程序)都不处理其标准输入-这只是一种方式。


问题是,您为什么真正要这样做?
彼得

2

据说

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

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

$ cat my_file.txt | xargs echo -e

或者只是您的要求(对转义序列没有任何解释):

$ cat my_file.txt | xargs echo

但是请注意,在使用时xargs echo(与默认命令xargsbtw 相同echo),它将是echo文件系统中将要运行的echo命令,而不是shell的内置命令。还要注意,xargs期望它以非常特定的格式输入(其中空格,换行符,引号,反斜杠具有特殊含义)。cat在这里没有多大意义,因为只有一个文件可以连接(与相同< file.txt xargs echo。请注意,Unix兼容echo的默认情况下会进行反斜杠转义扩展,并在输出-e时输出echo -e
StéphaneChazelas 17年

0

在bash中,以下内容也应起作用:

echo `cat my_file.txt`

反引号中的部分由该命令的输出替换,即在这种情况下,由文件内容替换。


的确,反引号的工作方式类似于$( . . . )。使用$()它们的人通常更喜欢它们,因为您可以嵌套它们。但是,这个问题很旧,回答尚未回答的问题会更令人满意!
Law

不完全的。有细微的差别。当使用反引号形式时,反斜杠保留其字面意思,除非后面加$,`或\。没有反斜杠的第一个反引号会终止命令。使用$(,,,)格式时,括号之间的所有字符均组成命令。
fpmurphy '16

由于没有引用该命令替换,因此将对其应用split + glob运算符。例如,如果my_file.txt包含*,则将在当前目录中打印文件名列表。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.