不明白(管道)使用unix

时间:2016-05-28 12:02:36

标签: shell unix pipe

我正在我的大学学习“操作系统”考试,我很难理解管道使用情况(|)。  这是我在互联网上找到的一个例子:

  

ps -ax | grep Finder
   使用ps命令获取系统上运行的进程列表,并将列表传递给grep以搜索包含“Finder”的行。 (通常,它会找到两个:Finder,以及执行grep Finder的进程。)

如果我第一次写ps -ax而下一行grep finder怎么办?不会有相同的结果?为什么我要把它们连在一起?

ps:unix shell命令的Bigginer及其工作原理。

3 个答案:

答案 0 :(得分:3)

重点关注输入和输出。

如果您要键入ps -ax > processes,则可以使用所有进程的列表创建文件processes。这是重定向输出。显示在屏幕上的所有数据都会写入文件。

如果您要输入grep Finder < processes,则会在文件processes中搜索单词Finder。这是重定向输入。

管道同时做到了。它重定向左侧命令的输出,并重定向右侧命令的输入。

$ ps -ax | grep Finder

就像

$ ps -ax > temp
$ grep Finder < temp

除了所有在一行上没有要删除的临时文件。

答案 1 :(得分:1)

Unix是基于文件的系统。除非您指定要重定向输出的位置,否则它将显示在屏幕上。

因此,如果您键入ps ax,它将列出屏幕上的所有正在运行的进程。 因此,如果您首先输入ps ax然后再输入grep,那么您将获得所有流程,然后您会收到错误,因为grep期望至少有2个参数,keyword和{{ 1}}。

所以你必须做两步。

filename

这会给你结果。

管道 ps ax > filename grep finder filename 将输出从左侧(作为文件)重定向到右侧命令。所以你可以合并这两个步骤。

因此,除了以上所有内容之外,您可以说|,它会将ps ax|grep finder的输出作为文件传递给ps ax命令。

请注意,您没有直接为grep指定文件名。相反,您告诉它使用grep的输出作为文件

答案 2 :(得分:1)

不,在上面提到的两种情况下结果不一样。尝试一下。

ps -ax本身会将其结果发送到标准输出。 grep Finder本身根本不起作用

pipe创建一个可用于进程间通信的单向数据通道。因此,ps -ax | grep finder基本上将ps -ax的输出重定向为grep Finder命令的输入流,然后在该流中搜索字符串'Finder'。