|(pipe) 运算符的替代方案

αғs*_*нιη 8 bash

我正在寻找|bash shell 中运算符的替代方法,用于将命令的输出重定向为下一个命令的输入。有什么替代方法吗?

就像是 :

command1 | command2 | command3
Run Code Online (Sandbox Code Playgroud)

替代方案:

command1 X command2 X command3
Run Code Online (Sandbox Code Playgroud)

X将代替|. 是否可以避免使用|它并将其替换为实际的操作员?

Roh*_*van 17

相当于command1 | command2IScommand2 < <(command1)

这也可以扩展到三个(或更多)命令。

command3 < <(command2 < <(command1))

$ lspci | grep 'Network'
 02:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)

$ grep 'Network' <(lspci)
 02:00.0 Network controller: Qualcomm Atheros AR9285 Wireless Network Adapter (PCI-Express) (rev 01)

$ lspci | grep 'Network' | grep -o 'controller'
 controller

$ grep -o 'controller' < <(grep 'Network' < <(lspci))
 controller
Run Code Online (Sandbox Code Playgroud)

然而,正如 Oli 所建议的,虽然这可能会产生相同的输出,但它在技术上与管道不同。

<(..) 将内部命令输出的 STDOUT 转换为文件处理程序(该命令,在您的示例中为 grep)打开。当您使用管道时,读取命令直接从 STDIN 读取(用管道命令的 STDOUT 填充)。细微的差异,但对于只知道如何读取 STDIN 的命令来说可能很重要。

  • 这在技术上是不正确的。`&lt;(..)` 将内部命令输出的 STDOUT 转换为文件描述符(在您的示例中为命令 `grep`)打开。当您使用管道时,读取命令直接从 STDIN 读取(用管道命令的 STDOUT 填充)。细微的差异,但对于只知道如何读取 STDIN 的命令来说可能很重要。 (4认同)
  • 值得注意的是,这是等价的;`lspci &gt;&gt;(grep 'Network' &gt;&gt;(grep -o 'controller'))` 从左到右阅读更方便。 (2认同)