假设我想查看已经运行的程序副本数量。我可以像下面这样做:
ps ax | grep -c "$0"
这个命令本身会产生预期的结果。但是如果我尝试将输出分配给一个变量,它会增加1!无论我怎么尝试:
var=$(ps ax | grep "$0" | sed -n '$=')
var=`ps ax | grep -c "$0"`
请问有人能向我展示正确捕获输出的方法吗?
同时了解为什么会出现这种情况也是很好的。
更新 在得到@fedorqui的第一次回应后,我意识到我的表述不够清晰。让我详细说明一下:
我在同一个bash脚本中运行了上面的三个命令。当我运行第一个命令时,它会打印出数字2:程序本身和带有该程序作为参数的grep进程。当我在变量赋值内运行相同的命令时,数字3被存储。
请注意,我使用了两种不同的行计数方法,即grep和sed。在两种情况下,它们都返回了错误答案3,而不是正确答案2。
以下是一个合并的示例,可以在test.sh文件中尝试:
echo -n "without assignment: "
ps ax | grep -c "$0"
var=$(ps ax | grep "$0" | sed -n '$=')
echo "using sed method: $var"
var=`ps ax | grep -c "$0"`
echo "using grep method: $var"
我的Debian系统的结果:
without assignment: 2
using sed method: 3
using grep method: 3
问题再次提出:为什么会发生这种情况,如何预防或解决?
./script.sh
运行脚本可以解决问题。如果我使用bash script.sh
运行,会多出一个进程。 - fedorquivar=$(ps | grep -e "$0")
运行了一个子shell,它也被返回。 - tripleee