| Both sides previous revisionPrevious revisionNext revision | Previous revision |
| informatique:linux:bash [2022/01/02 17:38] – [Liens/Ressources] pteu | informatique:linux:bash [2023/01/09 10:52] (current) – [-e] pteu |
|---|
| ====-e==== | ====-e==== |
| |
| **bash** se termine lorsqu'il voit un code de retour en erreur (différent de 0). Pratique pour éviter que des erreurs non prévues dans un script ne provoquent des bêtises. | Avec l'option ''-e'', bash se termine dès qu'une commande se termine avec un code de retour en erreur (différent de 0). Impossible a activer dans un shell, mais pratique pour éviter que des erreurs non prévues dans un script ne provoquent de gros problèmes. |
| Cependant ça ne marche pas correctement avec certaines commandes comme grep, qui retourne 1 s'il ne matche pas (ce qui n'est certainement pas une erreur qui vaut le coup que l'on stoppe le script). Alors, comme indiqué dans [[https://stackoverflow.com/questions/9952177/whats-the-meaning-of-the-parameter-e-for-bash-shell-command-line/9952249|ce thread de stackoverflow]] : | |
| * soit on gère l'erreur avec un ''grep TRUC machin.txt || :'' : on gère l'erreur pour que bash ne la "voit" pas. Cependant ce n'est pas idéal car on masque tous les codes d'erreur (pas que 1). | Cependant cela ne marche pas correctement avec certaines commandes comme grep, qui retourne 1 s'il ne matche pas (ce qui n'est certainement pas une erreur qui vaut le coup que l'on arrête le script). Alors, comme indiqué dans [[https://stackoverflow.com/questions/9952177/whats-the-meaning-of-the-parameter-e-for-bash-shell-command-line/9952249|ce thread de stackoverflow]] : |
| * soit, plus compliqué mais plus pertinent, on créé une fonction "grep" dans notre script pour surcharger la commande système grep, qui va gérer ses codes de retour pour filtrer les erreurs 1 mais pas toutes les autres, qu'elle renverra à bash pour qu'il se termine en affichant le code d'erreur de grep. | * soit on gère l'erreur avec un ''grep TRUC machin.txt || :'' : on gère le retour pour que bash ne la "voit" pas (si aucune action n'est nécessaire : ''grep TRUC machin.txt || true'' suffit ; cependant ce n'est pas idéal, car on masque tous les codes d'erreur (pas que 1). |
| | * soit, plus compliqué mais plus pertinent, on créé une fonction "grep" dans notre script pour surcharger la commande système grep, qui va filtrer les codes de retour = 1 (motif non trouvé) mais pas les autres, que bash pourra interpréter (erreur=2 : fichier inexistant par exemple). |
| <code bash> | <code bash> |
| #!/bin/bash -e | #!/bin/bash -e |
| Rappel : ''command'' permet de lancer la commande qui suit ("grep" ici) parmi les commandes internes et le contenu du $PATH uniquement, afin que notre fonction ne devienne pas récursive ! | Rappel : ''command'' permet de lancer la commande qui suit ("grep" ici) parmi les commandes internes et le contenu du $PATH uniquement, afin que notre fonction ne devienne pas récursive ! |
| |
| =====Debugger un script===== | ====-x==== |
| | |
| Pour vérifier la syntaxe d'un script sans lancer : ''set -n'' (ou ''bash -n mon_script.sh'') | |
| |
| Pour le débugger un script, ajouter dans le script : | Pour le débugger un script, ajouter dans le script : |
| #!/bin/sh -v | #!/bin/sh -v |
| </code> | </code> |
| | |
| | ====-n==== |
| | |
| | Pour vérifier la syntaxe d'un script sans le lancer (//run-dry//) : ''set -n'' (ou ''bash -n mon_script.sh'') |
| | |
| | ====-o pipefail==== |
| | |
| | Par défaut, après une suite de pipe (''|'') bash ne retient que le code de retour de la dernière commande (la plus à droite). En activant l'option pipefail, bash va renvoyer le dernier code de retour __en erreur__ dans la suite de pipes, ou "0" si toutes les commandes se terminent correctement. |
| | |
| | Combiné avec ''-e'', permet de terminer le script courant en cas de code d'erreur non traitée, même celles "cachées" par un pipe. |
| | |
| | Par exemple: |
| | <code bash> |
| | #!/bin/bash |
| | #set -eo pipefail |
| | foo | echo test1 |
| | echo test2 |
| | #test1 |
| | #line 3: foo: command not found |
| | #test2 |
| | </code> |
| | |
| | <code bash> |
| | #!/bin/bash |
| | set -eo pipefail |
| | foo | echo test1 |
| | echo test2 |
| | #test1 |
| | #line 3: foo: command not found |
| | </code> |
| | |
| | ====-u==== |
| | |
| | Avec cette option, bash va générer une erreur et stopper son exécution si une variable non déclarée est utilisée. Pour éviter cela, on utilisera la notation ''${var-default}'' pour s'assurer que si $var n'est pas définie, on lui attribuera la valeur "default" et bash ne génèrera pas d'erreur. |
| |
| =====.bashrc===== | =====.bashrc===== |