子shell的bash命令替换问题

时间:2015-09-12 18:52:31

标签: bash command substitution ps wc

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

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

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

#!/bin/ksh

CMD=`basename $0`
echo $CMD
ps -ef | grep "$CMD"
ps -ef | grep "$CMD" | wc -l
RUNS=`ps -ef | grep "$CMD" | wc -l`
echo $RUNS
if [ $RUNS -gt 2 ]; then
  echo The script is currently being run by another user.
  #exit 1
fi
RUNS=`ps -ef | grep "$CMD"`
echo "$RUNS"
RUNS=`echo "$RUNS" | wc -l`
echo $RUNS
if [ $RUNS -gt 2 ]; then
  echo The script is currently being run by another user.
  #exit 1
fi
ps -ef | grep "$CMD" | wc -l > lock
RUNS=`cat lock`
echo $RUNS
if [ $RUNS -gt 2 ]; then
  echo The script is currently being run by another user.
  exit 1
fi

我得到了正确的输出:

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),我仍然认为分配了命令替换值的变量应该返回与命令本身相同的值...

0 个答案:

没有答案