Comment puis-je écrire un script shell qui se termine, si une partie de celui-ci échoue? Par exemple, si l'extrait de code suivant échoue, le script doit quitter.
n=0
until [ $n -ge 5 ]
do
gksu *command* && break
n=$[$n+1]
sleep 3
bash
scripting
error-handling
Weylyn
la source
la source
set -e
. Cela ne s'applique pas vraiment ici cependant. L'OP veut quitter le script après 5 tentatives infructueuses d'exécution de la commande.set -e
c’est le seul moyen que je connaisse pour le faire.set -e
sontsleep
(break
étant une construction spéciale, le script se ferme en cas d'échec dans la plupart des shells, les commandes situéesif
à gauche ou à gauche de&&
ne sont pas affectées parset -e
,n=...
peuvent échouer si ellesn
sont en lecture seule, puis cela sortirait du script sansset -e
aussi bien), de sorte que l'interprétation semble assez improbable. Je conviens que la question est mal formulée.Vous pouvez quitter un script n'importe où en utilisant le mot clé
exit
. Vous pouvez également spécifier un code de sortie afin d'indiquer à d'autres programmes ce qui a été fait ou comment votre script a échoué, par exempleexit 1
ouexit 2
etc. les codes supérieurs à 127 sont réservés pour une terminaison anormale (par exemple par un signal)).La construction générique pour sortir en cas d'échec est
avec approprié
failure condition
etn
. Mais dans des scénarios spécifiques, vous pouvez procéder différemment. En ce qui concerne votre cas, j’interprète votre question, à savoir que si l’une des cinq invocations d’gksu
échec échouait, vous vouliez vous retirer. Une façon est d'utiliser une fonction comme celle-ciet ensuite, invoquer la boucle par
try_command
.Il existe des moyens (plus) avancés ou sophistiqués pour répondre à votre question. Cependant, la solution ci-dessus est plus accessible aux débutants que, par exemple, la solution de Stéphane.
la source
exit
quitte le script sauf s'il est appelé dans un sous-shell. Si cette partie du script est dans un sous - shell, par exemple parce qu'il est à l' intérieur(...)
ou$(...)
ou partie d'un pipe-line, il ne quittera que sous - shell .Dans ce cas, si vous souhaitez que le script se ferme en plus du sous-shell, vous devez faire appel
exit
à ce sous-shell.Par exemple, ici avec 2 niveaux imbriqués de sous-shell:
Cela peut devenir plus compliqué si le sous-shell fait partie d'un pipeline.
bash
a un spécial$PIPESTATUS
tableau, semblable àzsh
l »$pipestatus
un qui peut vous aider ici:la source
Le piège effectuera une action lors de la réception d'un signal.
Exécutez ceci et laissez-le sortir normalement. Il intercepte le signal 0.
Lancez-le à nouveau et interrompez avec ^ C. Il intercepte le signal 2 et le signal 0.
Un état de sortie non nul s'interrompt en ERR
la source