以下内容进行了简化,以帮助新用户。
好吧,首先,有必要了解标准输入和标准输出的概念。
在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
使用一些我不知道的涉及&符号和方括号的奥术语法来完成此操作。
|
是它不使用名称,l-hand命令的输出直接传递到管道r-hand侧的命令输入。