带有子shell的bash命令替换问题

带有子shell的bash命令替换问题,bash,command,substitution,ps,wc,Bash,Command,Substitution,Ps,Wc,我试图阻止一个脚本由多个用户同时运行,不想使用仅在某些操作系统或shell(pgrep、pidof等)上可用的命令,并遇到了一个问题,我不确定这是否是一个bug 请忽略我在脚本中使用的细节:问题在于使用ps时bash中的命令替换 当我运行以下命令时(注意ksh中的shebang): 我得到了正确的输出: testksh.sh7 abriere 19126 5669 0 14:15 pts/21 00:00:00 /bin/ksh ./testksh.sh7 abriere 19129

我试图阻止一个脚本由多个用户同时运行,不想使用仅在某些操作系统或shell(pgrep、pidof等)上可用的命令,并遇到了一个问题,我不确定这是否是一个bug

请忽略我在脚本中使用的细节:问题在于使用ps时bash中的命令替换

当我运行以下命令时(注意ksh中的shebang):

我得到了正确的输出:

testksh.sh7
abriere  19126  5669  0 14:15 pts/21   00:00:00 /bin/ksh ./testksh.sh7
abriere  19129 19126  0 14:15 pts/21   00:00:00 grep testksh.sh7
2
2
abriere  19126  5669  0 14:15 pts/21   00:00:00 /bin/ksh ./testksh.sh7
abriere  19137 19126  0 14:15 pts/21   00:00:00 grep testksh.sh7
2
2
在为bash替换shebang并相应地重命名脚本后,我得到了以下结果:

testbash.sh7
abriere   5631  5669  0 14:12 pts/21   00:00:00 /bin/bash ./testbash.sh7
abriere   5634  5631  0 14:12 pts/21   00:00:00 grep testbash.sh7
2
3
The script is currently being run by another user.
abriere   5631  5669  0 14:12 pts/21   00:00:00 /bin/bash ./testbash.sh7
abriere   5643  5631  0 14:12 pts/21   00:00:00 /bin/bash ./testbash.sh7
abriere   5645  5643  0 14:12 pts/21   00:00:00 grep testbash.sh7
3
The script is currently being run by another user.
2
注意ps输出中的额外行

bash中的以下行:

RUNS=`ps -ef | grep "$CMD" | wc -l`
不返回与以下值相同的值:

ps -ef | grep "$CMD" | wc -l
Ksh没有这个问题

正如您所看到的,有一些变通方法:我在脚本的最后一节中使用了一种

我在Linux、AIX和SunOS上运行了这些脚本,它们给出了相同的结果;只有Cygwin没有返回脚本,但是ps命令在两个shell中都没有返回脚本


这是虫子吗?即使bash在子shell中运行命令替换(参见问题21331042),我仍然认为变量赋值的命令替换应该返回与命令本身相同的值…

使用相同约束的大多数实用程序使用相同的策略:用当前运行的进程的PID创建一个<代码> xxx。当实用程序启动时,它检查临时文件是否存在,如果存在则停止。在您的案例中,是否有理由不使用这种众所周知的技术?这不是一个bug,因为这是一种可接受的操作。ksh和bash之间还有许多其他的差异,当然,结果也不同。例如,管道bash一端的
For
循环的行为会在子进程中运行每一端。另请参见@cdarke:我同意这不是一个bug。在Afaics中,Posix不要求子shell是一个单独的进程。我认为你的相关问题是一个愚蠢的问题,但我有点怀疑,所以我不想使用锤子;我建议您投票关闭或将您的评论作为答案。是的,在bash下,子shell有自己的进程id。在bash+linux下,运行
echo“$(ps f)”| less
,然后搜索
ps f
,您可以看到bash为运行命令替换而创建的所有进程。这不像
ps-ef
是可移植的,任何一个
ps -ef | grep "$CMD" | wc -l