一、前言
在linux管道的学习中,发现个很奇葩的问题,数值操作与管道结合后失效了。
二、描述
#((num++)) 可以独自完成自增1
#((num++)) | echo $num于管道结合后,自增1就失效了
#num=0
#echo $num
#0
#((num++))
#echo $num
#1
#((num++)) | echo ok 再次给num++
ok
#echo $num 发现数值计算与管道结合后,并没有真正的计算
#1
#((num++)) | echo $num 与管道结合后,依然不会做数值计算
#1
#echo $num
#1
三、解析
管道是一个很复杂的存在,什么“无名管道”、“有名管道”,在此不做过多的深究,先解决问题。
根本原因:管道两边的命令需要能够建立新的子进程。
#((num++)) 其本身不能创建新的子进程,改装一下就可以了
#((num++)) && true | echo $num
或者
#((num++)) && sleep 2 | echo $num
改装后,明显可以看到num可以自增1了
四、附注,简略介绍一下子进程
1.查看当前进程号命令($$ 和 $BASHPID)
$$ 和 $BASHPID,都可以查看当前子进程号;
区别是$$的特殊环境变量,$BASHPID普通环境变量,前者的优先级更高。
2.管道的使用,每次都会自动开启一个新的进程
1.$$与管道结合,每次都是显示$$所在的进程号(说明$$优先级>管道)
#echo $$ 显示当前进程号
3665
#echo $$
3665
#echo $$ | more
3665
#echo $$ | more
3665
#echo $$ | more
3665
#echo $$ | more 最终发现每次打印结果都是一样的
3665
2.$BASHPID与管道结合,每次都是显示管道的进程号(说明$BASHPID优先级<管道)
#echo $BASHPID 单独是查看,进程号一直都是3665
3665
#echo $BASHPID
3665
#echo $BASHPID
3665
#echo $BASHPID | more 结合管道后,每次都是显示的管道的进程号
18778
#echo $BASHPID | more 根据运行结果可以看到,管道的优先级高于普通变量
18783
#echo $BASHPaID | more 每次管道都会开启新的进程号
18788
#echo $BASHPID | more
18793
2.关于进程的一点结论
1.“echo $$ ”、“echo $BASHPID ”两个命令对应的pid,都指向的是同一个进程。
2.每次使用管道,内部都会为管道开启一个新的进程号。
3.管道所在进程的优先级有限,高于普通环境变量,低于特殊环境变量。
4.管道的使用,两边需要是可以开启新进程的命令,纯粹的数值计算因不开启新的进行,会导致计算失效。
五、尾言
文笔拙劣,才疏学浅,总结的如有偏差,望告知,共同探讨,希望本文能对爱学习的你有所帮助。如果你觉得还不错,赶快点赞收藏吧!
本文含有隐藏内容,请 开通VIP 后查看