2017-05-29 1 views
0

Ich möchte den Exit-Status des als Argument übergebenen Befehls erhalten (an mein SH-Skript mit der Bezeichnung a.sh).Shell-Skript: falscher Exit-Status des ausgeführten Befehls

Ich habe versucht:

#!/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" 

Nach Ausführung:

./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 

Allerdings, wenn ich den Befehl direkt in der Schale laufen sehe ich:

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

Wie sollte mein Skript Blick wie, um den korrekten Status 1 anstelle von 0 des ausgeführten Kommas zu erhalten nd?

Antwort

1

$(CMD) Ausgabe waren aaa | grep -q zzz das ist, warum es mit Exit 0 zurückkehren. Entfernen Sie einfach die Umleitung zu/dev/null und Sie werden sehen. Sie könnten eval verwenden, um Befehle von Variablen auszuführen.

#!/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" 
Verwandte Themen