【问题标题】:shell script: incorrect exit status of executed commandshell脚本:执行命令的退出状态不正确
【发布时间】:2017-05-29 04:43:47
【问题描述】:

我想获取作为参数传递的命令的退出状态(到我的名为 a.sh 的 sh 脚本)。

我试过了:

#!/bin/sh

CMD="$@"

echo "arg passed CMD: $CMD"
($CMD) >/dev/null 2>&1
res=$?
echo "exit status: $res"


CMD="echo aaa | grep -q zzz"

echo "in script CMD: $CMD"
($CMD) >/dev/null 2>&1
res=$?
echo "exit status: $res"

一旦执行:

./a.sh 'echo aa | grep -q zzz'
arg passed CMD: echo aa | grep -q zzz
exit status: 0
in script CMD: echo aaa | grep -q zzz
exit status: 0

但是,如果我直接在 shell 中运行命令,我会看到:

 /bin/sh -c 'echo aa | grep -q zzz ; echo $?'
 1

我的脚本应该是什么样子才能获得执行命令的正确状态1 而不是0

【问题讨论】:

    标签: shell exitstatus


    【解决方案1】:

    $(CMD) 的输出是aaa | grep -q zzz,这就是它返回退出 0 的原因。只需删除对 /dev/null 的重定向,您就会看到。 您可以使用 eval 从变量运行命令。

    #!/bin/sh
    
    CMD="$@"
    
    echo "arg passed CMD: $CMD"
    eval $CMD >/dev/null 2>&1
    res=$?
    echo "exit status: $res"
    
    CMD="echo aaa | grep -q zzz"
    
    echo "in script CMD: $CMD"
    eval $CMD >/dev/null 2>&1
    res=$?
    echo "exit status: $res"
    

    【讨论】:

      猜你喜欢
      • 2013-03-01
      • 2015-04-29
      • 2020-11-07
      • 1970-01-01
      • 2017-03-08
      • 2012-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多