解增言
2020-04-10 11:11
管道可以说是Linux下最重要的概念之一,也是Linux的灵魂所在。如果能理解并熟练使用管道,那么Linux也就学会了一大半。
管道是一种两个进程间进行单向通信的机制,它可以把上一个命令的输出传递给下一个命令,作为下一个命令的输入。管道的符号是“|”(看起来确实像个管子)。
有了管道,用户就可以按照自己的需要,将不同的命令(包括其选项)组合起来,完成在Windows下编程才能实现的任务。管道使得Linux成为一个开放的系统,系统提供了一个框架,而用户在该框架下可以自由发挥创造。
没有完美的人,但是有完美的团队。一个命令不可能完成所有工作,但把多个命令组合起来,可以完成大多数任务。
我们用下图来说明管道的工作机制。我们把数据看成是含有杂质需要过滤的水,命令看成管道中的过滤器,就像自来水经过几层过滤变成纯净水一样,原始数据经过管道中的命令处理,变成我们需要的数据后输出。
把上面图中的步骤分拆开会更清楚一些:
$ cat input.txt
dog 4
cat 8
mouse 5
cat 2
rabbit 3
$ cat input.txt | cut -f1
dog
cat
mouse
cat
rabbit
$ cat input.txt | cut -f1 | sort
cat
cat
dog
mouse
rabbit
$ cat input.txt | cut -f1 | sort | uniq
cat
dog
mouse
rabbit
每用管道连上一个命令后,检查输出,如果没有问题,再添加下一个命令,最后把数据处理成自己需要的内容和格式。
Linux的管道用于进程间的通信,分为无名管道(unnamed pipe)和有名管道(named pipe)。无名管道即上面所讲的管道,用来连接两个命令。有名管道又称命名管道、管道文件或FIFO文件(first in first out,先进先出,与数据结构中的队列类似),如/dev/initctl。管道文件在文件属性中的文件类型一列中显示为p,可用mkfifo命令创建,rm命令删除。管道文件可用来在两个进程间传递数据。
$ ls -l
总用量 8
-rw-rw-r-- 1 xiezy xiezy 35 4月 10 12:54 input.txt
-rw-rw-r-- 1 xiezy xiezy 21 4月 10 12:56 output.txt
$ mkfifo pipe_demo
$ ls -l
总用量 8
-rw-rw-r-- 1 xiezy xiezy 35 4月 10 12:54 input.txt
-rw-rw-r-- 1 xiezy xiezy 21 4月 10 12:56 output.txt
prw-rw-r-- 1 xiezy xiezy 0 4月 10 13:20 pipe_demo