我正在我的大学学习“操作系统”考试,我很难理解管道使用情况(|)。 这是我在互联网上找到的一个例子:
ps -ax | grep Finder
使用ps命令获取系统上运行的进程列表,并将列表传递给grep以搜索包含“Finder”的行。 (通常,它会找到两个:Finder,以及执行grep Finder的进程。)
如果我第一次写ps -ax
而下一行grep finder
怎么办?不会有相同的结果?为什么我要把它们连在一起?
ps:unix shell命令的Bigginer及其工作原理。
答案 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'。