linux管道符号“|”是什么意思 做?

cca*_*ert 22 linux bash command-line pipe

这是一个以相反顺序对文件夹中的文件进行排序的命令

ls | sort -r
Run Code Online (Sandbox Code Playgroud)

有什么作用 |该命令符号有?

我在这里真正寻找的是 Linux 初学者对管道的高级(易于理解)解释。我在 Superuser 上看到了有关管道的其他问题,但没有任何答案可以简单地解释它们的作用以及它们与重定向(><符号)的区别。

Dan*_*l B 29

如果您对输出和输入重定向感到满意,那么解释真的很简单。

Command1 | Command2
Run Code Online (Sandbox Code Playgroud)

Command1 > tempfile
Command2 < tempfile
Run Code Online (Sandbox Code Playgroud)

但没有tempfile. 的输出Command1直接连接到的输入,Command2传输发生在内存中。

  • 不,不是的。将一个命令的输出通过管道传输到另一个命令的输入时,不涉及文件系统操作。 (3认同)

Law*_*ceC 26

以下内容稍微简化以帮助新用户。

嗯,首先,有必要了解标准输入和标准输出的概念。

在 Linux 和其他类 UNIX 操作系统中,每个进程都有一个标准输入 ( stdin) 和一个标准输出 ( stdout)。通常情况下,那stdin是您的键盘,stdout是您的屏幕或终端窗口。

所以当你运行时ls,它会将它的输出扔到stdout. 如果你什么都不做,它会转到你的屏幕或终端窗口,你会看到它。

现在,一些 Linux 命令与用户交互,并用于stdin执行此操作,您的文本编辑器就是其中之一。它读取stdin以接受您的击键,执行操作,然后将内容写入stdout.

但是,也有一些非交互式或“过滤”命令不能交互工作,但需要一堆数据。这些命令会拿走所有的stdin东西,对它做点什么,然后把它扔给stdout

让我们看看另一个名为du- 代表磁盘使用情况的命令。 du /usr例如,将打印出(stdout像任何其他 Linux 命令一样)该目录中每个文件的列表及其大小:

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash
Run Code Online (Sandbox Code Playgroud)

正如您一开始就知道的那样,它没有排序,您可能希望它按大小顺序排序。

sort 是那些“过滤器”命令之一,它将从 stdin并对其进行排序。

所以,如果我们这样做:

# du /usr | sort -nr

我们得到了这个,这更好一点:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons
Run Code Online (Sandbox Code Playgroud)

您现在可以看到“管道”将stdout一个命令的 的连接到另一个命令的stdin。通常,您会在这样的情况下使用它,您希望过滤、排序或以其他方式操作命令的输出。如果您想通过多个过滤器类型的命令处理输出,它们可以级​​联。

如果您自己键入sort,它仍会尝试从stdin. 自从stdin已连接到您的键盘,它将等待您输入并处理内容,直到您按下 Control-D。它不会提示您,因为它实际上并不打算以交互方式使用。

程序可以判断是否 stdin是交互式的,因此如果您自己发出它们或在管道的末端发出它们,某些程序的行为可能会有所不同。

此外,管道只能以交互方式运行的程序,例如vi,将导致您度过一段不愉快的时光。

管道与重定向的不同之处在于,数据从一个命令混洗到下一个命令,而不会存储在任何地方。所以,在上面的例子中,du的输出没有存储在任何地方。大多数情况下,您不希望使用管道,因为使用管道的原因是以某种方式处理命令的输出 - 但是,有一个命令tee可以让您拥有蛋糕并吃掉它,它会将它收到的内容复制stdinstdout您选择的文件和文件中。您也可以bash使用一些我不知道的涉及与号和括号的神秘语法来做到这一点。