以下命令有什么区别:
$ input.txt > grep foo
$ grep foo < input.txt
$ cat input.txt | grep foo
$ grep foo input.txt
而且不仅仅是grep
。其他命令也是如此。
答案1
input.txt > grep foo
这可能是一个错误。它运行命令input.txt
并将输出重定向到名为grep
.这foo
是命令的一个参数input.txt
。grep foo < input.txt
foo
这会在输入中 查找来自 的字符串input.txt
。grep
不会在命令行上获取文件名,因此它将在标准输入上工作。 shell 将通过重定向确保文件的内容input.txt
在grep
.cat input.txt | grep foo
这与前面的类似,但标准输入流grep
现在连接到一个管道,cat
命令通过该管道传递文件的内容input.txt
。该cat
命令写入其标准输出流,该输出流grep
通过管道连接到标准输入流。grep foo input.txt
这使得grep
打开文件input.txt
并查找foo
其中的字符串。它不使用标准输入流。
一般来说:
管道 (
|
) 将其左侧的标准输出流与其右侧的标准输入流连接起来。输入重定向 (
<
) 从文件重定向到标准输入流。输出重定向 (
>
) 将标准输出重定向到文件。输入和输出流可以同时重定向,例如使用
commandname <inputfile >outputfile
,并且命令可以读取和写入管道,如 中的第二个命令command1 | command2 | command3
。重定向和管道可以组合起来:
cat <input.txt | grep foo >output.txt
.
许多 Unix 实用程序将输入文件名作为可选参数,如果未给出文件名,则将使用标准输入。
一些 Unix 实用程序仅有的适用于标准输入,例如tr
。
Bash 和其他一些 shell,例如ksh
,也支持使用<<<"string"
(称为这里的字符串),大多数 shell 都能理解此处文档(查找这些)。