Supposons qu'un script shell (/ bin/sh ou/bin/bash) contient plusieurs commandes. Comment puis-je nettoyer proprement le script si l'une des commandes a un statut de sortie défaillant? Évidemment, on peut utiliser des blocs et/ou des rappels, mais y a-t-il une manière plus propre et plus concise? L'utilisation de & & n'est pas vraiment une option non plus, car les commandes peuvent être longues, ou le script pourrait avoir des choses non triviales comme des boucles et des conditions.Scénarisation shell: mourir sur toute erreur
Répondre
à la norme sh
et bash
, vous pouvez
set -e
Il sera
$ help set
...
-e Exit immediately if a command exits with a non-zero status.
Il fonctionne aussi (ce que je pouvais rassembler) avec zsh
. Il devrait également fonctionner pour tout descendant de Bourne shell.
Avec csh
/tcsh
, vous devez lancer votre script avec #!/bin/csh -e
Peut être que vous pouvez utiliser:
$ <any_command> || exit 1
Ce modèle est utile pour ** quitter sélectivement en cas d'échec de commandes individuelles ** et aussi ** si vous voulez imprimer un message d'erreur personnalisé ** en premier. Pour ce faire, utilisez quelque chose comme '
Vivre et apprendre: Bash a une fonction de regroupement de commandes, donc il n'y a pas besoin de l'astuce 'eval' que j'ai mentionnée. Au lieu de cela, utilisez '
Vous pouvez vérifier $? pour voir ce que le code de sortie la plus récente est ..
par exemple
#!/bin/sh
# A Tidier approach
check_errs()
{
# Function. Parameter 1 is the return code
# Para. 2 is text to display on failure.
if [ "${1}" -ne "0" ]; then
echo "ERROR # ${1} : ${2}"
# as a bonus, make our script exit with the right error code.
exit ${1}
fi
}
### main script starts here ###
grep "^${1}:" /etc/passwd > /dev/null 2>&1
check_errs $? "User ${1} not found in /etc/passwd"
USERNAME=`grep "^${1}:" /etc/passwd|cut -d":" -f1`
check_errs $? "Cut returned an error"
echo "USERNAME: $USERNAME"
check_errs $? "echo returned an error - very strange!"
-1: Ceci est un antipattern trop fréquent. La solution de @ Barun est plus simple et plus idiomatique. – tripleee
même script que ci-dessus, mais comme une "approche plus ordonnée" (tout sur une seule ligne): foo = $ (grep "^ $ {1}"/etc/passwd) && foo = $ (echo "$ foo" | -d: -f1) && echo ok || echo not_ok (nb: si vous utilisez bash, et non limité à sh, vous pouvez obtenir le statut de sortie de n'importe quelle partie d'un pipeline, ce qui simplifie la logique grep/cut.) – michael
utilisez simplement set -e – Codefor
- 1. Toute commande scrubyt qui clique sur un lien renvoie une erreur 403 Erreur interdite
- 2. erreur script shell exécution en PHP
- 3. Linux shell équivalent sur IIS
- 4. XSD toute erreur de validation d'élément avec CDATA
- 5. Toute prise en charge des clés étrangères dans le shell de schéma CakePHP ou les migrations?
- 6. Java SWT - Texte sur un shell transparent?
- 7. Livre sur la programmation de shell Linux
- 8. Comment exécuter ShellExecute sur l'objet shell clsid?
- 9. Un autre shell ouvert sur le serveur?
- 10. iPhone UIViews dormir/mourir après avoir été remis en vue
- 11. Java + Tomcat, Connexion de base de données Mourir?
- 12. Comment utiliser un obfuscateur en toute sécurité?
- 13. Sur PHP Erreur Apache donne 500 Erreur
- 14. MySQL Rejoignez la colonne SUM sur toute la table
- 15. Toute raison pour laquelle IsNumeric() échoue sur un nombre?
- 16. Comment distribuer div sur toute la largeur d'un conteneur?
- 17. inet_ntoa sur toute une colonne d'une base de données
- 18. JavaScript shell?
- 19. AVAudioPlayer suspend toute l'application
- 20. Importation de toute la bibliothèque standard Python
- 21. Zend_Rest_Client - erreur sur localhost
- 22. Jeditable Async Revenir sur erreur
- 23. .htaccess à toute longueur
- 24. dans le script shell
- 25. Ecriture sur un port série avec un script shell
- 26. comment obtenir un shell de console sur mon téléphone symbian?
- 27. dans une commande shell
- 28. Groovy exécuter « cp * » commande shell
- 29. Toute alternative XML de TEX?
- 30. Avez-vous déjà travaillé sur le «code old school» qui vous fait mourir un peu à chaque fois?
Merci, cela semble être ce que je veux. Je devrais affûter mon Google fu, je suppose ... :) – Pistos
Notez que les commandes dans les conditions peuvent échouer sans provoquer la sortie du script - ce qui est crucial. Par exemple: si grep quelque chose/un/où; alors: il a été trouvé; d'autre: il n'a pas été trouvé; ça marche bien, peu importe si quelque chose se trouve dans/un/où. –
Vous dites "standard sh". Cela signifie-t-il que c'est POSIX? Edit: J'ai vérifié et c'est POSIX: http://pubs.opengroup.org/onlinepubs/009695399/utilities/set.html – Taywee