Aperçu
La commande `set` permet d'ajuster finement l'environnement d'exécution des scripts shell. Elle offre diverses fonctionnalités telles que l'arrêt du script en cas d'erreur, la prévention de l'utilisation de variables non définies et le suivi de l'exécution des commandes.
Fonctionnalités principales
- Définir et désactiver les options du shell
- Définir les paramètres positionnels
- Aide au débogage de scripts
Options principales
La commande `set` propose diverses options à caractère unique et des options à nom long via l'option `-o`. Voici les options fréquemment utilisées.
Options de contrôle de script
Options -o (noms longs)
Commande générée :
Essayez de combiner les commandes.
Description:
`set` Exécute la commande.
Essayez d'exécuter virtuellement les commandes avec l'IA en combinant les options ci-dessus.
Exemples d'utilisation
Arrêt immédiat du script en cas d'erreur
#!/bin/bash
set -e
echo "Début"
false # Cette commande retourne un code de sortie non nul.
echo "Ce message ne sera pas affiché."
Configure le script pour qu'il s'arrête immédiatement en cas d'erreur.
Génération d'une erreur lors de l'utilisation d'une variable non définie
#!/bin/bash
set -u
echo "Début"
echo "$UNDEFINED_VAR" # Cette variable n'est pas définie, donc une erreur se produira.
Fait en sorte que le script s'arrête lors de la tentative d'utilisation d'une variable non initialisée.
Suivi de l'exécution des commandes (débogage)
#!/bin/bash
set -x
VAR="Hello"
echo "$VAR World"
ls -l /tmp
Affiche toutes les commandes exécutées par le script, ce qui aide au débogage.
Détection d'erreurs dans les pipelines
#!/bin/bash
set -o pipefail
echo "Début"
false | echo "Ce message sera affiché, mais le script sera considéré comme échoué."
# Si set -e est également utilisé, le script s'arrêtera à false.
Fait en sorte que l'ensemble du pipeline soit considéré comme échoué si une commande intermédiaire dans le pipeline échoue.
Combinaison fréquente et puissante
set -euo pipefail
Une combinaison recommandée pour écrire des scripts shell stables.
Vérification des options du shell actuel
set -o
Vérifie l'état de toutes les options définies dans le shell actuel.
Définition des paramètres positionnels
set -- "pomme" "banane" "cerise"
echo "Premier paramètre : $1"
echo "Tous les paramètres : $@"
Vous pouvez définir manuellement les paramètres positionnels d'un script ($1, $2, etc.) en utilisant `set --`. Ceci est utile pour les tests ou dans des situations spécifiques.
Conseils et précautions
La commande `set` peut améliorer considérablement la robustesse des scripts shell, mais elle doit être utilisée avec précaution.
Combinaison recommandée
Il est fortement recommandé d'ajouter la combinaison `set -euo pipefail` en haut de la plupart des scripts shell pour améliorer la stabilité.
- set -e: Arrête immédiatement en cas d'erreur pour éviter un comportement inattendu.
- set -u: Détecte les bogues potentiels causés par l'utilisation de variables non définies à un stade précoce.
- set -o pipefail: Détecte les échecs des commandes intermédiaires dans un pipeline pour juger avec précision du succès ou de l'échec de l'ensemble du pipeline.
Désactivation des options
Vous pouvez désactiver des options spécifiques en utilisant `+`, comme `set +e`, `set +u`. Ceci est utile lorsque vous devez modifier temporairement le comportement d'une option uniquement pour une partie spécifique du script. Par exemple, si un script doit continuer à s'exécuter même si une commande échoue, vous pouvez utiliser `set +e`, puis rétablir `set -e` une fois cette opération terminée.
Utilisation pour le débogage
`set -x` est très utile pour le débogage car il affiche en détail le processus d'exécution du script. Il est conseillé de l'ajouter au début du script, puis de le supprimer ou de le commenter une fois le débogage terminé. `set -v` affiche les lignes d'entrée telles quelles, ce qui aide à comprendre le flux du script.
Paramètres positionnels et `--`
`set --` définit tous les arguments suivants comme paramètres positionnels ($1, $2, etc.) et garantit que ces arguments ne sont pas interprétés comme des options, même s'ils commencent par `-`. Ceci est particulièrement important lors de la redéfinition de `$@` ou `$*` dans un script.