微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux-Bash:内联执行返回重复的“进程”.为什么?

bash:4.3.42(1)-发行版(x86_64-pc-linux-gnu)

执行以下脚本:

# This is myscript.sh
line=$(ps aux | grep [m]yscript)  # A => returns two duplicates processes (why?)
echo "'$line'"
ps aux | grep [m]yscript          # B => returns only one

输出

'tom   31836  0.0  0.0  17656  3132 pts/25   S+   10:33   0:00 bash myscript.sh
tom   31837  0.0  0.0  17660  1736 pts/25   S+   10:33   0:00 bash myscript.sh'
tom   31836  0.0  0.0  17660  3428 pts/25   S+   10:33   0:00 bash myscript.sh

为什么内联执行的ps-snippet(A)返回两行?

解决方法:

摘要

这将创建一个子外壳,因此两个进程正在运行:

line=$(ps aux | grep [m]yscript) 

这不会创建子外壳.因此,myscript.sh仅运行一个进程:

ps aux | grep [m]yscript       

示范

让我们稍微修改一下脚本,以便将流程和子流程PID保存在变量行中:

$cat myscript.sh 
# This is myscript.sh
line=$(ps aux | grep [m]yscript; echo $$$BASHPID)
echo "'$line'"
ps aux | grep [m]yscript  

在bash脚本中,$$是脚本的PID,在子shell中未更改.相比之下,当输入子shell时,bash使用子shell的PID更新$BASHPID.

这是输出

$bash myscript.sh 
'john1024  30226  0.0  0.0  13280  2884 pts/22   S+   18:50   0:00 bash myscript.sh
john1024   30227  0.0  0.0  13284  1824 pts/22   S+   18:50   0:00 bash myscript.sh
30226 30227'
john1024   30226  0.0  0.0  13284  3196 pts/22   S+   18:50   0:00 bash myscript.sh

在这种情况下,30226是主脚本上的PID,30227是运行ps aux |的子外壳的PID. grep [m] yscript.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐