Linux 管道符号“|”起什么作用?

Linux 管道符号“|”起什么作用?

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

ls | sort -r

|该命令中的符号起什么作用?

我真正想要的是为 Linux 初学者提供高水平(易于理解)的管道解释。我在 Superuser 上看到了有关管道的其他问题,但没有一个能引出一个答案,用简单的术语解释它们的作用以及它们与重定向(><符号)的区别。

答案1

以下内容略作简化,以帮助新用户。

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

在 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

正如您立即就能看出的那样,它没有排序,而您可能希望它按大小排序。

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

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

如果您sort自己输入,它仍会尝试从 读取stdin。由于stdin已连接到您的键盘,它会等待您输入并处理内容,直到您按下 Control-D。它不会提示您,因为它实际上并非用于交互。

程序可以判断是否stdin是交互式的,因此,如果您单独发布程序或在管道末端发布程序,某些程序可能会采取不同的行为。

此外,通过管道传输一个只能以交互方式运行的程序(例如vi)将会让你度过一段糟糕的时光。

管道与重定向不同,数据从一个命令转移到下一个命令,而不存储在任何地方。因此,在上面的例子中,du的输出不存储在任何地方。大多数时候,您不希望使用管道来实现这一点,因为使用管道的原因是以某种方式处理命令的输出 - 但是,有一个命令tee可以让您鱼与熊掌兼得,它会将接收到的内容复制stdin到您选择的文件中。您也可以使用一些我不知道的涉及符号和括号的神秘语法stdout来做到这一点。bash

答案2

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

Command1 | Command2

作用相同

Command1 > tempfile
Command2 < tempfile

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

答案3

管道符 ( |) 将一个程序的输出连接到另一个程序的输入。

在此示例中,echo打印单词hello,并wc -c对其输入进行字符计数(包括换行符):

echo hello | wc -c
6

答案4

为了理解这一点,请自己尝试一下:

sort -r

现在你被光标挂住了,它什么也没做。如果你输入一些数据会发生什么?

1
2
3
5
4

还是什么都没有,对吧?现在按 ctrl+D

5
4
3
2
1

因此 sort 的作用是,它接受输入(您输入的内容),对其进行处理(排序)并将其作为输出返回。该ls命令不接受输入,它只生成输出。管道符号从 接受输出ls,并将其作为输入提供给sort命令。

>不将输出提供给程序,而是将输出存储为文件。<使用文件作为输入。

相关内容