linux管道

linux命令上的管道大家想必是经常用了 cat 1.txt | grep xxx; 这是常见的用法,说说管道,pipe是 liunx上常见的IPC方法,在 linux system programming 中有两种,有名管道和无名管道,有名管道可以用在任意两个进程,而无名管道只能用在有亲属关系的进程,如我们一般所写的命令行就是无名管道(我猜是,不知道shell会怎么做,当然可以不是:) )。管道是需要内核来做一些维护工作的(无名管道显然是进程持续性,但有名管道是不是呢,记不清,请翻阅unix network programming :IPC, 我觉得应该是,好像没有必要搞得不一样),进程需要进入内核态中进行读取,所以编程中这不是一种快速的RPC,命令行就随意了。
说远了,这里主要说命令行,重点是什么,既管道两边命令是属于不同进程空间的,那么这就意味的左边的变量,是传不到右边的管道,或者右边的管道,变量值不能给左边,举个例子:
下面展示一些 内联代码片

// A code block
count =0
cat test.txt | while read lline
do
	let count++
done
echo $count

这里count会输出test.txt的行数吗?不会,只会输出0,因为管道右边的while已经是子进程了,count不是父进程中的count.
再说一下其他的有趣问题。
下面展示一些 内联代码片

// An highlighted block
cat test.txt
this_is_test.txt

test.tx内容如上,那么

// An highlighted block
echo test.txt | cat

这么做可以显示test.txt的内容吗,其实不可以,因为管道做的内容是将上一个命令的输出作为下一个命令的标准输入,所以,cat 获得了标准输入,而不是一个参数,cat只能再如实的打印test.txt,这里应该用xargs。
同时find -exec {} ; 也可以做类似的事。

03-27 08:16