Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision |
informatique:linux:bash [2020/11/11 16:53] – Options & co pteu | informatique:linux:bash [2020/11/18 15:34] – [Options] -e pteu |
---|
* ''!!'' (re)lancer la dernière commande | * ''!!'' (re)lancer la dernière commande |
* ''!$'' le dernier argument de la dernière commande | * ''!$'' le dernier argument de la dernière commande |
* ''^foo^bar'' lancer la dernière commande en remplaçant "foo" par "bar". Pour supprimer "foo" : ''^foo'' tout court. | * ''^foo^bar'' relancer la dernière commande en remplaçant la première occurrence de "foo" par "bar". Pour supprimer "foo" : ''^foo'' tout court. |
| * ''!!:gs/foo/bar'' relance la dernière commande en remplaçant toutes les occurrences de "foo" par "bar". |
=====Syntaxe===== | =====Syntaxe===== |
| |
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===== |