据我了解,管道( | )
获取一个进程的标准输出并将其作为标准输入传递给另一个进程。
但我想知道 pipe( | )
是否被视为 ls、grep 等命令。
下面的命令行中有多少个命令?
ls /etc | grep nginx
我很困惑是否应该数管子( | )
据我了解,管道( | )
获取一个进程的标准输出并将其作为标准输入传递给另一个进程。
但我想知道 pipe( | )
是否被视为 ls、grep 等命令。
下面的命令行中有多少个命令?
ls /etc | grep nginx
我很困惑是否应该数管子( | )
在 Bash 中,管道(
|
以及|&
)不是命令,而是控制运算符。从这个参考:
因此,在您的示例的上下文中,
ls
并且grep
将是命令,您不应包含管道。证明在实际测试中。在 bash 中:
返回:
尽管:
其中 a 和 b 是未知命令,返回:
没有参考 | 因为管道在任何两个任意命令之间使用时都很好,问题是这些命令不存在。
我怀疑“b:找不到命令”首先出现,因为接收器 (b) 必须在发送器 (a) 之前运行。如果它们被启动 (a) 然后 (b),如果 (b) 启动的时间比 (a) 开始发送的时间长,则数据将无处可去。
添加到另一个答案:管道操作符告诉shell这两个命令应该组织在一个管道中,就像从一个到另一个的文本流一样。为此,shell 通过调用内核创建了一个匿名管道,即一个类似于 FIFO 文件的通道。然后 shell 运行这两个命令,将管道的输入作为其标准输出文件描述符传递给第一个命令,并将管道的输出作为其标准输入传递给第二个命令。所以文本通过管道从第一个命令的标准输出到第二个命令的标准输入。
如果管道符号表示一个单独的命令,则该程序需要以某种方式获取其他两个命令的进程,然后将匿名管道的文件描述符传递给它们(假设这在非父进程和子进程之间是可能的),并且这些程序需要在它们已经运行时将它们的标准输出和标准输入与这些描述符交换 - 同时存在潜在的输出丢失的危险。这一切通过 shell 更容易完成,它已经知道这两个进程,与它们有特殊的父关系,并且可以在开始时提供文件描述符。