linux答疑(三):linux 数值计算与管道结合后,数值计算将失效 | #((num++)) | echo $num 详解 | 闭坑指南

发布于:2022-10-16 ⋅ 阅读:(348) ⋅ 点赞:(0)

一、前言

在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 后查看

网站公告

今日签到

点亮在社区的每一天
去签到