举例一:
* 对于管道
在bash下执行命令:tail -f num.txt | grep aaa
此时在另一个shell窗口中输入:ps aux | grep tail
pxj 5026 0.0 0.0 3300 732 pts/1 S+ 15:27 0:00 tail -f num.txt
pxj 5031 0.0 0.0 3220 772 pts/0 R+ 15:27 0:00 grep tail
再输入:ps aux | grep aa
pxj 5027 0.0 0.0 3220 768 pts/1 S+ 15:27 0:00 grep aaa
pxj 5039 0.0 0.0 3220 760 pts/0 R+ 15:27 0:00 grep aa
由上面的输出可见tail -f num.txt的PID=5026,grep aaa的PID=5027,说明是两个不同的进程。
* 对于重定向: tail -f num.txt > /tmp/num
执行:ps aux | grep tail
pxj 6041 0.0 0.0 3300 740 pts/0 S+ 16:06 0:00 tail -f num.txt
只有一个进程。
举例二(摘自<高级 Bash 脚本编程指南>):
作为子进程的运行的管道,不能够改变脚本的变量.
1 variable="initial_value"
2 echo "new_value" | read variable
3 echo "variable = $variable" #variable = initial_value
举例三:
* 代码一:
while read line
do
a[$line]='a'
echo "in while:"${a[$line]}
done < num.txt
#输出数组中所有元素
echo ${a[*]}
代码一的输出:
in while:a
in while:a
in while:a
in while:a
in while:a
in while:a
==a a a a a a #注意:使用重定向,数组的元素得以输出。
* 代码二:
cat num.txt | while read line
do
a[$line]='a'
echo "in while:"${a[$line]}
done
echo "=="${a[*]}
代码二的输出:
in while:a
in while:a
in while:a
in while:a
in while:a
in while:a
== #注意:使用管道,数组的元素为空。
因为管道是在子进程中执行,所以当子进程退出之后,给数组a赋的值也随着子进程的退出而消失了。
因而,代码二最后一行看到的数组a并不是while循环中的数组a。
参考文献:
<高级 Bash 脚本编程指南>
以为内容为个人的一点理解,本人水平有限,如有差错,还请高手斧正,谢谢!

希望有高手能全面地讲讲管道与重定向的区别。