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] 举报,一经查实,本站将立刻删除。