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传输发生在内存中。
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可以让您拥有蛋糕并吃掉它,它会将它收到的内容复制stdin到stdout您选择的文件和文件中。您也可以bash使用一些我不知道的涉及与号和括号的神秘语法来做到这一点。