shell脚本:执行命令的退出状态不正确
shell script: incorrect exit status of executed command
我想获取作为参数传递的命令的退出状态(我的 sh 脚本名为 a.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
?
$(CMD)
输出是 aaa | grep -q zzz
,这就是它 return 和出口 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"
我想获取作为参数传递的命令的退出状态(我的 sh 脚本名为 a.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
?
$(CMD)
输出是 aaa | grep -q zzz
,这就是它 return 和出口 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"