Shell中BASH与KSH使用管道时的差别

大笑注:此文涉及实际项目源码截图,查看时可不关注处理逻辑! 大笑   

     根据测试与实际的使用过程中发现:BASH中管道内都为子进程,而KSH中最后一个管道为父进程其他为子进程!(简单的测试过程放在最后)。

因此KSH与BASH转换时,在使用管道的地方,有以下几种情况时,需要注意:
(一)    管道+read的方式:主进程读取不了值

例如:


建议修改:
1.    这里可以读取多个值(推荐这种方式修改):
 
2.    这里只可以读取一个值:

 

(二)    管道+while read:需要读取while read中的值;读取不了管道中的值
例如:

 

建议修改:
1.    通过”()”强制将输出数据语句与管道最后一个保持在一个进程内
 
2.    通过<<<这个进行处理
修改为:
While read test1 test2
Do
Done<<<”`cat *.txt`”
(三)    Cat 文件+while read:需要读取while read中的值;读取不了管道中的值
例如:
Cat file.txt|while read
Do
文件操作
Done
取文件操作中的值(可能为文件计算总和)
建议方式:
while read
Do
文件操作
Done< file.txt
取文件操作中的值(可能为文件计算总和)
#####这里不使用管道就避免了这种情况!
(四)    管道+while:需要从while中退出脚本;退出管道后,脚本继续运行
例如:

 

说明:这里的exit 1是不会退出脚本的,会输出echo的内容,脚本继续执行;造成脚本逻辑判断失误与信息输出不规范
建议修改:

a.    子进程输出返回信息,主进程判断管道最后的退出状态!(也可以管道返回状态码,主进程判断)


总之,目前BASH中使用管道时,都要当做子进程对待;因此,特别是想退出脚本或读取管道中处理的值时,需要特别注意!
(五)    管道+while &+wait;不会等待;
例如:
echo |..|while read file
do
(
……
)
done
wait
这种写法本身也是有点错误,因为我们的本意是等待while中的&,那么wait就应该和它待在一起,而由于bash中的最后管道为子进程,因此,才造成了bash与ksh不同;
建议修改:
echo |..|(while read file
do
(
……
)
done
wait)
使用()将其强制放到一个进程中。
(六)    测试证明过程
 
这里只是进行了简单的测试进行证明,如需要详细了解,可以通过观察进程号等信息,或者查询官方手册。我目前看到网上有这方面问题的指出,但都不太全面;因此把项目过程中遇到的问题在这里总结一下。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值