114 votes

Ignorer des erreurs spécifiques dans un shell script.

J'ai un petit extrait d'un shell script qui a le potentiel de lancer de nombreuses erreurs. J'ai le script actuellement configuré pour s'arrêter globalement sur toutes les erreurs. Cependant, je voudrais que cette petite sous-section soit légèrement différente.

Voici l'extrait :

recover database using backup controlfile until cancel || true; 
auto

Je m'attends à ce que cela produise une erreur "fichier non trouvé". Cependant, je voudrais poursuivre l'exécution malgré cette erreur. Pour toute autre erreur, je voudrais que le script s'arrête.

Quelle serait la meilleure méthode pour y parvenir ?

Bash Version 3.00.16

218voto

devnull Points 45016

Afin d'amener bash à ignorer les erreurs pour des commandes spécifiques, vous pouvez dire :

some-arbitrary-command || true

Cela permettrait au script de continuer. Par exemple, si vous avez le script suivant :

$ cat foo
set -e
echo 1
some-arbitrary-command || true
echo 2

En l'exécutant, on obtient :

$ bash foo
1
z: line 3: some-arbitrary-command: command not found
2

En l'absence de || true dans la ligne de commande, il aurait produit :

$ bash foo
1
z: line 3: some-arbitrary-command: command not found

Citation du manuel :

L'interpréteur de commandes ne se termine pas si la commande qui échoue fait partie de l'ensemble des commandes de l'utilisateur. qui suit immédiatement une commande while o until mot-clé, qui fait partie de le test dans un if qui fait partie de toute commande exécutée dans une && ou || sauf la commande qui suit la dernière && o || toute commande dans un pipeline, à l'exception de la dernière, ou si le statut de retour de la commande est inversé avec ! . Un piège sur ERR si elle est définie, est exécutée avant que le shell l'interpréteur de commandes.

EDIT : Afin de modifier le comportement de manière à ce que l'exécution se poursuive. seulement si exécution de some-arbitrary-command a retourné file not found dans le cadre de l'erreur, vous pouvez dire :

[[ $(some-arbitrary-command 2>&1) =~ "file not found" ]]

À titre d'exemple, exécutez ce qui suit (aucun fichier nommé MissingFile.txt existe) :

$ cat foo 
#!/bin/bash
set -u
set -e
foo() {
  rm MissingFile.txt
}
echo 1
[[ $(foo 2>&1) =~ "No such file" ]]
echo 2
$(foo)
echo 3

Cela produit le résultat suivant :

$ bash foo 
1
2
rm: cannot remove `MissingFile.txt': No such file or directory

Notez que echo 2 a été exécuté mais echo 3 ne l'était pas.

49voto

Chris Cogdon Points 108

Utilisez :

command || :

: est une fonction intégrée de bash qui renvoie toujours un résultat positif. Et, comme nous l'avons vu plus haut, || court-circuite de sorte que le RHS n'est exécuté que si le LHS échoue (renvoie un résultat non nul).

Les suggestions ci-dessus d'utiliser 'true' fonctionnent également, mais sont inefficaces car 'true' est un programme externe.

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