2008-12-16 1 views
14

J'utilise actuellement cette fonction pour emballer les commandes d'exécution et consigner leur exécution, et le code retour, et quitter en cas de code retour différent de zéro .Quelle est la meilleure façon d'écrire une fonction wrapper qui exécute des commandes et enregistre leur code de sortie

Cependant, ceci est problématique car apparemment, il double l'interpolation, en faisant des commandes avec des guillemets simples ou doubles dans le script.

Pouvez-vous recommander un meilleur moyen?

est ici la fonction:

do_cmd() 
{ 
    eval $* 
    if [[ $? -eq 0 ]] 
    then 
     echo "Successfully ran [ $1 ]" 
    else 
     echo "Error: Command [ $1 ] returned $?" 
     exit $? 
    fi 
} 

Répondre

19
"[email protected]" 

De http://www.gnu.org/software/bash/manual/bashref.html#Special-Parameters:

@

Étend aux paramètres de position, à partir d'un. Lorsque l'expansion se produit entre guillemets, chaque paramètre se développe en un mot distinct . Autrement dit, "$ @" équivaut à "$ 1" "$ 2" .... Si l'expansion entre guillemets se produit dans un mot, l'expansion du premier paramètre est jointe à la partie initiale du mot original , et l'expansion du dernier paramètre est jointe avec la dernière partie du mot d'origine. Lorsqu'il n'y a pas de paramètres de position, "$ @" et $ @ se développent à zéro (c'est-à-dire qu'ils sont supprimés).

Cela signifie que les espaces dans les arguments sont repris correctement.

do_cmd() 
{ 
    "[email protected]" 
    ret=$? 
    if [[ $ret -eq 0 ]] 
    then 
     echo "Successfully ran [ [email protected] ]" 
    else 
     echo "Error: Command [ [email protected] ] returned $ret" 
     exit $ret 
    fi 
} 
+0

bien. battu moi dans le temps: p –

+0

Bien sûr, 'cmd; si [[$? -eq 0]]; alors stuff est écrit plus idiomatiquement 'if cmd; alors stuff'. – tripleee

+1

Mais le code devrait utiliser $ ret plus tard, de sorte qu'il est plus clair à mon humble avis. –

5

additionnel à "[email protected]" ce que dit Douglas, j'utiliser

return $? 

Et pas exit. Il quitterait votre shell au lieu de revenir de la fonction. Si dans le cas que vous voulez quitter votre shell en cas de problème, vous pouvez le faire en l'appelant:

do_cmd false i will fail executing || exit 
# commands in a row. exit as soon as the first fails 
do_cmd one && do_cmd && two && do_cmd three || exit 

(De cette façon, vous pouvez gérer les échecs et gracieusement sortie).

Questions connexes