Utilisation de set dans le shell Bash

Niraj Menon 30 janvier 2023
  1. Traçage des commandes avec set -x dans Bash
  2. Autres options utiles pour set dans Bash
Utilisation de set dans le shell Bash

Le shell Bash contient plusieurs commandes intégrées utiles pour manipuler l’environnement d’une session shell en cours d’exécution. La commande intégrée set permet d’afficher et de modifier les variables et les options d’environnement du shell.

Ce didacticiel traite de la gamme d’utilisations de la commande set et de la manière d’écrire efficacement des scripts Bash pour configurer de bonnes options d’environnement.

Traçage des commandes avec set -x dans Bash

Par défaut, l’exécution de la commande set seule renverra une liste des variables actuellement définies et de leurs valeurs, y compris l’emplacement de l’exécutable Bash, les informations de version et les variables d’environnement telles que PATH.

L’utilisation de la commande est lorsque vous affichez les commandes exécutées. Si vous êtes un programmeur, cela pourrait vous aider à déboguer vos scripts Bash pour voir s’ils échouent à une commande spécifique.

Pour ce faire, exécutez set -x ou set -o xtrace, qui active le traçage des commandes. Alors que la commande elle-même ne produit rien, les commandes suivantes seront imprimées juste avant l’exécution. Il est utile d’utiliser des extensions d’accolades - une fonctionnalité récente de Bash - dans vos commandes.

Si vous avez une commande pour supprimer les fichiers TXT numérotés, l’activation du suivi de la commande set affichera la forme développée des accolades avec tous les fichiers TXT de ce répertoire.

user@linux:~$ set -x
user@linux:~$ cd /tmp
+ cd /tmp
user@linux:~$ # example of expansion (and comments do not print out in traces)
user@linux:~$ touch {1..5}.txt
+ touch 1.txt 2.txt 3.txt 4.txt 5.txt
user@linux:~$ rm -f *.txt
+ rm -f *.txt
user@linux:~$ # however, asterisk globs do not expand.

Autres options utiles pour set dans Bash

La commande set offre de nombreuses autres options mutuellement exclusives pour le fonctionnement du shell, similaires au traçage de commandes, telles que ne pas exécuter la commande, changer la ligne de commande en un éditeur de style Emacs, imprimer des backtraces lorsqu’une erreur se produit, etc.

Gardez à l’esprit que pour activer une option, vous devez utiliser set -o <option_name> et set +o <option_name> pour la désactiver.

Une liste complète de ces options est expliquée ci-dessous, avec des informations provenant du manuel GNU pour l’ensemble intégré.

  1. allexport - Si vous avez un script Bash qui définit des variables d’environnement et que vous souhaitez que ces variables soient disponibles pour le shell actuel et tous les sous-shells suivants, set -a ou set -o allexport provoque ces variables à exporter et devient disponible pour ces contextes shell.
  2. braceexpand - l’expansion des accolades nous permet d’étendre un ensemble constant d’une paire de nombres en une chaîne délimitée par des espaces de la plage de ces nombres. La désactivation de cette option désactivera l’expansion des accolades si vous souhaitez qu’une commande inférieure dans le shell évalue les accolades.
  3. Emacs - Active l’édition basée sur emacs sur la ligne de commande pour ceux qui la connaissent.
  4. errexit - Si une commande dans un script Bash se termine avec un code d’état différent de zéro, le script entier s’arrêtera. Cela peut être évité en associant la commande défaillante à une seconde commande qui renvoie un code de sortie nul pour empêcher le script de se fermer prématurément.
  5. errtrace - Une trace de la commande défaillante s’imprime si un programme se termine avec un code d’état différent de zéro.
  6. hashall - Garde une trace des emplacements de commande lorsqu’ils sont recherchés dans l’environnement PATH. Il met en cache les chemins de commande dans un emplacement pour une recherche et une exécution plus rapides.
  7. histexpand - Développe le “!” caractère dans les chaînes en tant que fonctionnalité de substitution d’historique. Si vous rencontrez des difficultés pour utiliser le “!” caractère dans les chaînes et ne faites pas beaucoup de travail de substitution d’historique, vous pouvez désactiver cette option en toute sécurité.
  8. History - C’est une fonctionnalité cruciale qui vous permet de maintenir une liste des commandes précédemment exécutées.
  9. ignoreeof - Le caractère EOF (fourni par Ctrl-D) quitte généralement un shell Bash ou une commande acceptant une entrée. La désactivation de cette option entraîne l’ignorance d’EOF, ce qui pourrait casser certaines commandes qui n’acceptent que EOF.
  10. Monitor - Active le contrôle des tâches, obligeant les processus qui s’exécutent en arrière-plan à imprimer leur code de sortie lorsqu’ils terminent leur exécution. Il est utile de vérifier les processus d’arrière-plan lorsqu’ils se terminent.
  11. noclobber - Empêche les utilitaires de redirection Bash tels que >&, <> de tronquer les fichiers existants. C’est pratique si vous avez affaire à de vrais fichiers journaux pendant les tests et que vous ne souhaitez pas supprimer accidentellement les journaux existants.
  12. noexec - Affiche les commandes mais ne les exécute pas. S’il est utilisé dans un script, noexec peut ignorer certaines commandes et en exécuter d’autres en les activant et les désactivant à certains moments.
  13. noglob - Empêche l’expansion des globs (c’est-à-dire *.txt).
  14. Notify - Lorsqu’il est utilisé avec moniteur, notifier imprime immédiatement les codes d’état des tâches en arrière-plan, au lieu d’attendre la prochaine invite du shell.
  15. nounset - Renvoie un code d’erreur si une variable n’est pas définie et que sa valeur est tentée d’être lue.
  16. onecmd - Quittez après avoir lu et exécuté la commande suivante.

Plus d’options sont dans le manuel ci-dessus, si vous souhaitez les lire. Espérons que ces options peuvent améliorer votre expérience de programmation Bash.

Si vous souhaitez en savoir plus sur ces options à partir de la ligne de commande, essayez d’exécuter le help set. Nous recommandons également la page du projet de documentation Linux pour plus d’informations sur la commande set.