我有一个名为 的文件,my_file.txt
其内容只是字符串Hello
.我如何将其内容重定向到命令echo
?
我知道我有命令less
,cat
...more
但我需要用 来执行它echo
。
我试过这个:
$ cat my_file.txt | echo
还有这个:
$ echo < my_file.txt
但在这两种情况下,它仅在标准输出中显示为空白,而不是 my_file.txt 的内容。
我怎么能这么做呢?
答案1
您可以重定向所有您想要的内容 echo
,但它不会对其执行任何操作。echo
不读取其标准输入。它所做的只是将其写入标准输出论点由空格字符分隔并由换行符终止(并且某些echo
实现中带有扩展的转义序列和/或以-
可能被视为选项开头的参数)。
如果要echo
显示文件的内容,则必须将该内容作为参数传递给echo
.就像是:
echo "$(cat my_file.txt)"
请注意,$(...)
删除尾随换行符s从该命令的输出中cat
,并echo
添加一后退。
另请注意,除了 with 之外zsh
,您不能在命令的参数中传递 NUL 字符,因此上述命令通常不适用于二进制文件。yash
还将删除不构成有效字符一部分的字节。
如果想要这样做的原因是因为您想要echo
扩展文件中的\n
, \b
, ... 转义序列(如 UNIX 一致实现所做的那样,\0351
echo
但不是所有的), 然后你宁愿printf
用:
printf '%b\n' "$(cat my_file.txt)"
与此相反echo
,该文件是可移植的,如果文件内容以-
.
作为 的替代方案$(cat file)
,使用ksh
、zsh
和bash
,还可以这样做:$(<file)
。这是一个特殊的运算符,其中壳与cat
读取文件内容来弥补扩展相反。它仍然会去除尾随的换行符并阻塞 NUL 字节,除了zsh
.在 中bash
,这仍然会产生一个额外的过程。另请注意,一个区别是,如果尝试以这种方式读取目录类型的文件,则不会收到任何错误。另外,虽然$(< file)
很特殊,但$(< file; other command)
不是(在 中zsh
,当不模拟其他 shell 时,仍然会file
通过运行来扩展 的内容隐含的 $READNULLCMD
命令(通常是寻呼机))。
答案2
添加到其他答案,您还可以尝试输入重定向而不是cat
echo "$(<my_file.txt)"
或者
echo "`<my_file.txt`"
$(...)
并`...`
执行相同的操作,即命令替换。它在其范围内运行命令,并将输出提供给 shell,就像用户将其作为输入给出一样。这两者唯一的区别是$(...)
可以简单嵌套,`...`
需要转义才能嵌套。
命令替换周围的引号保留空格
答案3
正如所说,
如果要
echo
显示文件的内容,则必须将该内容作为参数传递给echo
例如,您可以这样做xargs
(考虑到您需要启用对反斜杠转义):
$ cat my_file.txt | xargs echo -e
或者只是你所问的(没有解释)转义序列):
$ cat my_file.txt | xargs echo
答案4
当谈到重定向时,需要注意的是,Linux 命令可以以不同的方式解释您传递给它们的参数,从而导致不同的行为。关键的部分是要理解
- 某些命令需要文件路径并将该文件的内容放入其 STDIN 中。之后,此类命令从那里读取、处理它并产生输出。例如,
cat
这样做。 - 其他命令在其 STDIN 中不放置任何内容,并且不从那里读取。换句话说,STDIN 被简单地忽略。相反,他们直接读取参数并生成输出。
因此,某些命令可以完全依赖于其 STDIN 中的内容,而其他命令则不在乎其中的内容。这对于重定向很重要,因为如果您将 STDOUT 重定向到忽略它的命令的 STDIN,您将不会获得所需的行为。
如果你跑
cat
你会注意到好像cat
挂着,等待着什么。发生这种情况的原因是,如果没有内容传递到 STDIN 内,则默认情况下标准输入将附加到键盘。换句话说,cat
正在等待我们输入任何内容并按回车键发送给它。
另一方面,
echo
只是保留该命令,因为它不从 STDIN 读取。由于它没有参数,因此没有任何内容可打印。
因此,如果您输入
echo < my_file.txt
通常,echo
将被my_file.txt
视为参数并简单地my_file.txt
在 STDOUT 中生成,但<
会改变my_file.txt
shell 的处理方式。现在, shell不再将的内容my_file.txt
作为参数传递给,而是将 的内容放入 的 STDIN 中。正如我们之前看到的,它不打印任何内容,因为不从标准输入读取。echo
./my_file.txt
echo
echo
如果您确实希望echo
从 STDIN 读取,则必须使用xargs
,即
xargs echo < my_file.txt
<
不是my_file.txt
一个参数,而是一个内容放在 STDIN 中的文件的路径。xargs
echo
使用从 STDIN 读取的参数运行给定它的命令 ( )。
现在它会打印出“Hello”。
相似地,
cat my_file.txt | xargs echo
也有效:
cat
获取内容./my_file.txt
并将其放入其 STDIN 中,并在其 STDOUT 中打印该内容。- 管道
|
获取 STDOUTcat
并将其放入 STDIN 中,echo
而不是在终端上打印此 STDOUT(默认行为)。 xargs
echo
使用从 STDIN 读取的参数运行给定它的命令 ( )。