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 revisionBoth sides next revision
informatique:linux:bash [2020/11/12 15:00] – [Rappels et substitutions] pteuinformatique:linux:bash [2020/11/18 15:34] – [Options] -e pteu
Line 85: Line 85:
 Les options de bash peuvent se modifier au lancement sous forme de paramètre (''bash -e'' par ex.) ou dans un script via le mot-clé ''set''. Elles permettent de tuner le shell en modifiant son comportement par défaut. Les options de bash peuvent se modifier au lancement sous forme de paramètre (''bash -e'' par ex.) ou dans un script via le mot-clé ''set''. Elles permettent de tuner le shell en modifiant son comportement par défaut.
  
 +====-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.
 +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).
 +    * 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.
 +<code bash>
 +#!/bin/bash -e
 +function grep () {
 +    local exit_code
 +    command grep "$@" || exit_code=$?
 +    return $(( exit_code == 1 ? 0 : exit_code ))
 +}
 +grep PATTERN FILE     # won't kill script if no matches are found
 +</code>
 +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===== =====Debugger un script=====
informatique/linux/bash.txt · Last modified: 2023/01/09 10:52 by pteu