L'exécution d'un script shell lance une nouvelle instance de l'interpréteur de commande. De la même manière que sont interprétées les commandes tapées en ligne de commande, un script bash exécute une liste de commandes lues dans un fichier. Chaque script shell exécuté est en réalité un sous-processus du shell parent, celui qui vous donne une invite à la console ou dans une fenêtre xterm
Un script shell peut également lancer des sous-processus. Ces sous-shells permettent au script de faire de l'exécution en parallèle, donc d'exécuter différentes tâches simultanément.
Liste de commandes entre parenthèses
Une liste de commandes placées entre parenthèses est exécutée sous forme de sous-shells
![]() | Les variables utilisées dans un sous shell ne sont pas visibles en dehors du code du sous-shell. Elles ne sont pas utilisables par le processus parent, le shell qui a lancé le sous-shell. Elles sont en réalité des variables locales. |
Exemple 20-1. Etendue des variables dans un sous-shell
#!/bin/bash # subshell.sh echo variable_externe=Outer ( variable_interne=Inner echo "A partir du sous-shell, \"variable_interne\" = $variable_interne" echo "A partir du sous-shell, \"externe\" = $variable_externe" ) echo if [ -z "$variable_interne" ] then echo "variable_interne non défini dans le corps principal du shell" else echo "variable_interne défini dans le corps principal du shell" fi echo "A partir du code principal du shell, \"variable_interne\" = $variable_interne" # $variable_interne s'affichera comme non initialisé parce que les variables # définies dans un sous-shell sont des "variables locales". echo exit 0 |
Voir aussi Exemple 32-1.
+
Le changement de répertoire effectué dans un sous-shell n'a pas d'incidence sur le shell parent.
Exemple 20-2. Lister les profiles utilisateurs
#!/bin/bash # allprofs.sh: affiche tous les profils utilisateur. # Ce script a été écrit par Heiner Steven, et modifié par l'auteur du document. FICHIER=.bashrc # Fichier contenant le profil utilisateur, #+ était ".profile" dans le script original. for home in `awk -F: '{print $6}' /etc/passwd` do [ -d "$home" ] || continue # Si pas de répertoire personnel, passez au #+ suivant. [ -r "$home" ] || continue # Si non lisible, passez au suivant. (cd $home; [ -e $FICHIER ] && less $FICHIER) done # Quand le script se termine, il n'y a pas de besoin de retourner dans le #+ répertoire de départ parce que 'cd $home' prend place dans un sous-shell. exit 0 |
Un sous-shell peut être utilisé pour mettre en place un << environnement dédié >> à un groupe de commandes.
COMMANDE1 COMMANDE2 COMMANDE3 ( IFS=: PATH=/bin unset TERMINFO set -C shift 5 COMMANDE4 COMMANDE5 exit 3 # Sortie du sous-shell. ) # Le shell parent n'a pas été affecté, et son environnement est préservé (ex : #+ pas de modification de $PATH). COMMANDE6 COMMANDE7 |
if (set -u; : $variable) 2> /dev/null then echo "La variable est définie." fi # Peut également s'écrire [[ ${variable-x} != x || ${variable-y} != y ]] # ou [[ ${variable-x} != x$variable ]] # ou [[ ${variable+x} = x ]]) |
if (set -C; : > lock_file) 2> /dev/null then echo "Un autre utilisateur exécute déjà ce script." exit 65 fi # Merci, S.C. |
Des processus peuvent être exécutés en parallèle dans différents sous-shells. Cela permet de séparer des tâches complexes en plusieurs sous composants exécutés simultanément.
Exemple 20-3. Exécuter des processus en parallèle dans les sous-shells
(cat liste1 liste2 liste3 | sort | uniq > liste123) & (cat liste4 liste5 liste6 | sort | uniq > liste456) & # Concatène et trie les 2 groupes de listes simultanément. # Lancer en arrière plan assure une exécution en parallèle. # # Peut également être écrit : # cat liste1 liste2 liste3 | sort | uniq > liste123 & # cat liste4 liste5 liste6 | sort | uniq > liste456 & wait # Ne pas exécuter la commande suivante tant que les sous-shells # n'ont pas terminé diff liste123 liste456 |
Redirection des Entrées / Sorties (I/O) dans un sous shell en utilisant << | >>, l'opérateur tube (pipe en anglais), par exemple ls -al | (commande).
![]() | Un bloc de commandes entre accolades ne lance pas un sous-shell. { commande1; commande2; commande3; ... } |
Précédent | Sommaire | Suivant |
Remplacement | Niveau supérieur | Shells restreints |