2013-01-17 3 views
7

Ich versuche, eine Funktion in einem Shell-Skript zu erstellen, das einen Befehl nimmt und führt sie mit eval, und dann hat einige Nachbearbeitung auf dem Erfolg des Befehls basiert. Leider verhält sich der Code nicht so, wie ich es erwarten würde. Hier ist, was ich habe:Erhalten Sie Exit-Code für eval Befehl in sh

#!/bin/sh 

... 

function run_cmd() 
{ 
     # $1 = build cmd 

     typeset cmd="$1" 
     typeset ret_code 

     eval $cmd 
     ret_code=$? 

     if [ $ret_code == 0 ] 
     then 
       # Process Success 
     else 
       # Process Failure 
     fi 

} 

run_cmd "xcodebuild -target \"blah\" -configuration Debug" 

Wenn der Befehl ($cmd) erfolgreich ist, es funktioniert gut. Wenn der Befehl fehlschlägt (z. B. Kompilierungsfehler), wird das Skript automatisch beendet, bevor der Fehler verarbeitet werden kann. Gibt es eine Möglichkeit, zu verhindern, dass eval austritt, oder gibt es einen anderen Ansatz, mit dem ich mein gewünschtes Verhalten erreichen kann?

+2

sollte es keine automatische Ausfahrt sein, wenn Sie 'gesetzt haben irgendwo in Ihrem Skript -e'. Wenn Sie es haben, wird 'set + e' es deaktivieren. –

+0

* seufz * Ich hatte 'set -o errexit', das oben im Skript des Anrufers verweilte. Danke, dass du darauf hingewiesen hast. – Jeff

Antwort

13

Das Skript sollte nur beendet, wenn Sie set -e irgendwo im Skript haben, werde ich so davon ausgehen, dass der Fall ist. Ein einfacher Weg, um die Funktion zu schreiben, die set -e von Auslösen eines automatischen Ausgang verhindern zu tun:

run_cmd() { 
     if eval "[email protected]"; then 
       # Process Success 
     else 
       # Process Failure 
     fi 
} 

Beachten Sie, dass function ist nicht tragbar, wenn die Funktion definiert, und überflüssig, wenn () werden ebenfalls verwendet.

Verwandte Themen