275 votes

Vérifier l’état de sortie de Bash de plusieurs commandes efficacement

Est-il quelque chose de similaire à pipefail pour des commandes multiples, comme un 'essai' instruction, mais à l'intérieur de bash. Je voudrais faire quelque chose comme ceci:

echo "trying stuff"
try {
    command1
    command2
    command3
}

Et à tout moment, si une commande échoue, le décrochage et l'écho de l'erreur de la commande. Je ne veux pas avoir à faire quelque chose comme:

command1
[ $? -ne 0 ]; then
    echo "command1 borked it"
fi

command2
[ $? -ne 0 ]; then
    echo "command2 borked it"
fi

Et ainsi de suite... ou quelque chose comme:

pipefail -o
command1 "arg1" "arg2" | command2 "arg1" "arg2" | command3

Car les arguments de chaque commande je crois (corrigez-moi si je me trompe) interfèrent les unes avec les autres. Ces deux méthodes semblent horriblement longue haleine et méchant pour moi, donc je suis ici attrayant pour une méthode plus efficace.

282voto

krtek Points 15497

Vous pouvez écrire une fonction qui lance et teste la commande pour vous :

189voto

William Pursell Points 56211

Qu'entendez-vous par "abandon et l'écho de l'erreur"? Si vous voulez dire que vous souhaitez que le script pour mettre fin dès qu'une commande échoue, puis il suffit de faire

set-e

au début du script. Ne vous embêtez pas en écho avec le message d'erreur: laisser le défaut de commande de la poignée. En d'autres termes, si vous ne:

#!/bin/sh

set-e
command1
command2
command3

et command2 échoue, lors de l'impression, un message d'erreur vers stderr, alors, il semble que vous avez obtenu ce que vous voulez. (À moins que j'ai mal interpréter ce que vous voulez!)

Comme corollaire, toute commande que vous écrivez doivent se comportent bien: il doit signaler les erreurs à stderr vers stdout (l'exemple de code dans la question imprime des erreurs sur la sortie standard stdout) et il doit sortir avec un état différent de zéro lorsqu'il échoue.

89voto

John Kugelman Points 108754

J’ai un ensemble de fonctions de script que j’utilise abondamment sur mon système Red Hat. Ils utilisent les fonctions du système de d’imprimer vert rouge et `` indicateurs de l’État.

Vous pouvez éventuellement définir la `` variable d’un nom de fichier journal si vous souhaitez enregistrer quelle commandes échouent.

Son utilisation

Sortie

Code

52voto

John Kugelman Points 108754

Pour ce que ça vaut, un chemin plus court à écrire du code pour vérifier chaque commande pour réussir est :

Il est toujours pénible, mais au moins c’est lisible.

35voto

Dennis Williamson Points 105818

Au lieu de la création de fonctions de coureur ou à l’aide de , utilisez un :

Le piège a même accès au numéro de ligne et la ligne de commande de la commande qui a déclenché il. Les variables sont et .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X