您可能使用过类似的语法 cmd0 | cmd1 | cmd2
在您的终端中很多次。
您可能还知道它是管道重定向,用于将一个命令的输出重定向为下一个命令的输入。
但是你知道下面是什么吗? 管道重定向实际上是如何工作的?
不用担心,因为今天我将揭开 Unix 管道的神秘面纱,这样下次你和那些花哨的竖线约会时,你就会确切地知道发生了什么。
注意:我在某些地方使用了 Unix 一词,因为管道的概念(就像 Linux 中的许多其他东西一样)起源于 Unix。
Linux 中的管道:总体思路
以下是您将随处看到的关于“什么是 Unix 管道?”的内容:
- Unix管道是一种IPC(进程间通信)机制,它将一个程序的输出转发到另一个程序的输入。
现在,这是大家给出的一般解释。 我想深入。 让我们去掉抽象,以更技术性的方式重新表述上一行:
- Unix 管道是一种 IPC(进程间通信)机制,它采用
stdout
程序并将其转发给stdin
另一个程序通过缓冲区。
好多了。 去掉抽象使它更干净,更准确。 您可以查看下图以了解管道的工作原理:
最简单的一种 example 管道命令的核心是将一些命令输出传递给 grep 命令以搜索特定字符串。
为了 example,您可以搜索名称包含 txt 的文件,如下所示:
请记住:管道将标准输出重定向到标准输入,但不作为命令参数
要理解的一件非常重要的事情是管道传输 stdout
的命令 stdin
另一个但不作为命令参数。 我会解释它 example.
如果你使用 cat
不带任何参数的命令,它将默认读取 stdin
. 这是一个 example:
$ cat
Subscribe to Linux Handbook for more articles like this
^D
Subscribe to Linux Handbook for more articles like this
这里我用 cat
没有传递任何文件,所以它默认为 stdin
. 接下来我写了一行,然后使用 Ctrl+d 让它知道我写完了(Ctrl+d 表示 EOF 或 End Of File)。 一旦我写完,猫从 stdin
并将那一行写到 stdout
.
现在考虑以下命令:
echo hey | cat
第二个命令不等于 cat hey
. 在这里, stdout
,“嘿”,被带到缓冲区,并转移到 stdin
的 cat
. 由于没有命令行参数, cat 默认为 stdin
用于读取,并且标准输入中已经有一些东西,所以 cat 命令接受它,并打印到 stdout
.
实际上,我创建了一个名为 hey 的文件,并在其中放入了一些内容。 您可以在下图中清楚地看到差异:

Linux 中的管道类型
Linux 中有两种管道:
- 未命名管道,也称为匿名管道
- 命名管道
阅读全文
本文的其余部分仅供 LHB 会员使用。 您现在可以免费注册以阅读本文的其余部分以及访问所有仅限会员的帖子。 您还可以订阅我们的双周 Linux 通讯。
订阅
已经有一个帐户?
登入