我是 linux 系统的新手,我真的不明白为什么我们需要两个可以重定向输出的运算符:pipe as|
和 ouput redirection operator >
?我们不能总是使用第二个吗?大多数时候,如果多个命令链接在一起,我会看到使用管道。但是,如果输出重定向到文件,如中echo 'hello' > filename
,则使用输出重定向运算符。我在这里错过了什么?
我是 linux 系统的新手,我真的不明白为什么我们需要两个可以重定向输出的运算符:pipe as|
和 ouput redirection operator >
?我们不能总是使用第二个吗?大多数时候,如果多个命令链接在一起,我会看到使用管道。但是,如果输出重定向到文件,如中echo 'hello' > filename
,则使用输出重定向运算符。我在这里错过了什么?
我相信 < > 运算符用于读/写文件,而 | 符号用于将一个命令的标准输出通过管道传输到另一个命令。
允许您在名为 less 的命令中查看 cal 的输出。
将 cal 的输出放入名为 less 的文件中。
|
用于将一个命令的输出作为输入发送到管道符号之后的另一个命令。要将一个命令的输出重定向到文件,您可以使用输出重定向
>
运算符。它写入
foo
file1。您不需要手动创建该文件。如果你想将输出重定向到许多文件,那么你必须使用
tee
命令。它写入
foo
文件 1 和文件 2。您不需要手动创建该文件。现在 file1 和 file2 只包含字符串foo
。有很多关于输出重定向的讨论,但我认为这个问题是关于输入的。我将忽略
>
and>>
因为它们与输入无关。相反,我将专注于<
,<(...)
和|
:<
期望从文件中读入STDIN
while,<(...)
提供STDOUT
命令的文件句柄(...
此处)|
STDOUT
从一个进程到STDIN
下一个进程的管道所以
<
它不直接等同于管道(它从文件<(...)
中读取)并且是从正确的位置读取,但它提供文件句柄作为输出。您需要将它们组合起来以提供相当于管道的功能。只是阅读,我希望完整解释管道存在的原因。它更具可读性。
要记住的关键点是管道是进程间通信设备,它允许两个进程(这就是命令的真正含义)交换数据,而重定向运算符用于操纵特定进程写入的位置。
在视频Unix Pipeline中,语言的创造者
awk
和 AT&T Unix 的创始人之一 Brian Kernighan 解释道:如您所见,在创建管道的上下文中,它们实际上不仅仅是通信设备,还可以节省存储空间并简化开发。当然,我们可以对所有内容使用输出/输入重定向(尤其是现在存储容量在 TB 范围内),但是从存储和处理速度的角度来看,这将是低效的——记住你是直接提供输出从一个命令到另一个命令
|
。考虑类似的东西command1 | grep 'something'
。如果将command1
first 的输出写入文件,则写入所有内容需要时间,然后让grep
浏览整个文件。有了管道和输出被缓冲这一事实(意味着左侧进程在右侧进程准备好再次读取之前暂停),输出直接从一个命令转到另一个命令,从而节省了时间。值得注意的是,对于进程间通信,有一个named pipes的用例,您可以使用
>
运算符从一个命令写入,并<
让另一个命令从中读取,这是一个您确实想要的用例在文件系统上有特定的目的地,多个脚本/命令可以写入并就该特定目的地达成一致。但在不必要的时候,匿名管道|
才是你真正需要的。