Answers
特意查了一下《UNIX环境高级编程》第2版第9章一节:9.9 shell执行程序,其中讲到如果在shell中执行如:
cat1 xxx | cat2 &
执行以上命令之后,shell打印出来的PID跟用
echo $!
打印出来的PID一样,这个PID并不是cat1的PID,而是cat2的PID,shell在处理这种管道连接的命令时,它是先创建最后一个命令的进程(即cat2),然后在cat2进程中,创建前面命令的进程,所以cat1是cat2的子进程,故
ps aux | grep cat1
查看到的cat1的PID跟
echo $!(其实是cat2的PID)
查看到的不一样。
我用&&符号也在shell做了类似的测试,发现结果跟我上面说的一致,也就是说无论用&&还是管道,shell处理的方式一样。