2013-01-17 15 views
7

Próbuję utworzyć funkcję w skrypcie powłoki, która pobiera komendę i wykonuje ją za pomocą eval, a następnie wykonuje pewne przetwarzanie końcowe w oparciu o powodzenie komendy. Niestety kod nie zachowuje się tak, jak bym się spodziewał. Oto co mam:Uzyskaj kod wyjścia dla polecenia eval w 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" 

Gdy komenda ($cmd) się powiedzie, to działa dobrze. Jeśli polecenie nie powiedzie się (na przykład błąd kompilacji), skrypt zostanie automatycznie zamknięty, zanim będę mógł przetworzyć błąd. Czy istnieje sposób, w jaki mogę zapobiec evalowi z wychodzenia z domu, czy też istnieje inne podejście, które mogę podjąć, aby osiągnąć pożądane zachowanie?

+2

nie powinno być automatycznego wyjścia, chyba że w twoim skrypcie znajduje się 'set -e'. Jeśli go masz, 'set + e' wyłączy to. –

+0

* westchnienie * Miałem 'set -o errexit' utrzymujące się na górze skryptu wywołującego. Dziękuję za wskazanie tego. – Jeff

Odpowiedz

13

Skrypt powinien wyjść tylko wtedy, gdy masz gdzieś w skrypcie set -e, więc zakładam, że tak jest. Prostszy sposób napisać funkcję, która będzie zapobiegać set -e od wyzwalanie automatyczne wyjście to zrobić:

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

Zauważ, że function nie jest przenośny przy definiowaniu funkcji, a zbędne, jeśli stosowane są również ().