2017-05-29 14 views
0

引数として渡されたコマンドの終了ステータスを取得したいとします(shスクリプトのa.sh)。シェルスクリプト:実行されたコマンドの終了ステータスが正しくありません

私が試した:

#!/bin/sh 

CMD="[email protected]" 

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 

をしかし、私は以下を参照してください。

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

どのようにすべき私のスクリプトを見てのように、実行されたコンマの0の代わりに正しいステータス1を取得するnd?

答えて

1

$(CMD)出力がaaa | grep -q zzzであるため、出口0で戻ってきます。/ dev/nullへのリダイレクトを削除すると表示されます。 evalを使って変数からコマンドを実行することができます。

#!/bin/sh 

CMD="[email protected]" 

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" 
関連する問題