User Tools

Site Tools


informatique:linux:bash

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
informatique:linux:bash [2022/01/02 17:38] – [Liens/Ressources] pteuinformatique:linux:bash [2023/01/09 10:52] (current) – [-e] pteu
Line 89: Line 89:
 ====-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éalcar 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 (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
Line 104: Line 105:
 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 :
Line 117: Line 116:
 #!/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=====
informatique/linux/bash.1641145115.txt.gz · Last modified: 2022/01/02 17:38 by pteu