这是一个按相反顺序对文件夹中的文件进行排序的命令
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
命令。
>
不将输出提供给程序,而是将输出存储为文件。<
使用文件作为输入。