|
|||||||
|
|
BASHSection: Manuel de l'utilisateur Linux (1)Updated: 20 Janvier 1999 Index Return to Main Contents NOMbash - Interpréteur de commandes GNU Bourne-Again SHell.SYNOPSISbash [options] [fichier]COPYRIGHTBash est sous Copyright (C) 1989, 1999 de la Free Software Foundation, Inc.DESCRIPTIONBash est un interpréteur (Shell) compatible sh qui exécute les commandes lues depuis l'entrée standard, ou depuis un fichier. Bash incorpore également des fonctionnalités provenant des interpréteurs Korn et C-shell (ksh et csh).Bash est conçu pour être conforme aux spécifications IEEE concernant les shells et les outils Posix (Groupe de travail de l'IEEE 1003.2). OPTIONSEn plus des caractères d'options documentés dans la description de la commande interne set, bash accepte les arguments suivants lorsqu'on l'invoque :
Bash reconnaît également plusieurs options multi-caractères. Ces options doivent, pour être reconnues, apparaître sur la ligne de commande avant les options mono-caractère.
ARGUMENTSS'il reste des arguments sur la ligne de commande après l'analyse des options, et si ni l'option -c, ni l'option -s ne sont présentes, le premier argument est supposé être le nom du fichier dans lequel lire les commandes. Lorsque bash est invoqué de cette manière, $0 contient le nom du fichier, et les autres paramètres positionnels contiennent les arguments restants. Bash lit, et exécute, les commandes depuis ce fichier, puis se termine. Le code de retour de bash est celui de la dernière commande exécutée dans le fichier script. Si aucune commande n'a été exécutée, le code de retour est 0.INVOCATIONUn shell est dit de login si le premier caractère de son argument numéro zéro est un -, ou s'il est invoqué avec l'option -login.Un shell est interactif si son entrée standard et sa sortie standard sont toutes deux connectées à un terminal (déterminé par la fonction isatty(3)), ou s'il est invoqué avec l'option -i. Le paramètre PS1 est positionné, et le paramètre $- contient la lettre i si bash est interactif, ce qui permet à un script ou à un fichier de démarrage de vérifier l'état du shell. Le paragraphe suivant décrit comment bash exécute ses fichiers d'initialisation. Si l'un de ces fichiers existe mais n'est pas accessible en lecture, bash signale une erreur. Les tildes sont remplacées par des noms de fichiers comme décrit dans le paragraphe Développement du Tilde de la section Développement. Lorsque bash est lancé comme shell de login interactif, ou comme shell non-interactif avec l'option --login, il lit et exécute tout d'abord les commandes se trouvant dans le fichier /etc/profile s'il existe. Après lecture de ce fichier, il recherche ~/.bash_profile, ~/.bash_login, et ~/.profile, dans cet ordre, et exécute les commande se trouvant dans le premier fichier existant et accessible en lecture. L'option --noprofile peut être utilisée au démarrage du shell pour empêcher ce comportement. Lorsqu'un shell de login se termine, bash lit et exécute les commandes du fichier ~/.bash_logout, s'il existe. Quand un shell interactif démarre sans être un shell de login, bash lit et exécute les commandes se trouvant dans ~/.bashrc s'il existe. Ce comportement peut être inhibé à l'aide de l'option --norc. L'option --rcfile fichier forcera bash à exécuter les commandes dans fichier plutôt que dans ~/.bashrc. Quand bash est démarré de manière non-interactive, pour lancer un script shell par exemple, il recherche la variable BASH_ENV dans l'environnement, développe son contenu si elle existe, et considère cette valeur comme le nom d'un fichier à lire et exécuter. Bash se comporte comme si la commande suivante se trouvait en début de script :
mais la valeur de la variable PATH n'est pas utilisée pour rechercher le fichier. Si bash est invoqué sous le nom sh, il essaye d'imiter le comportement de démarrage des versions historiques de sh autant que possible, tout en restant conforme au standard Posix. Lorsqu'il est invoqué comme shell de login interactif (ou non-interactif avec l'option --login), il essaye d'abord d'exécuter les commandes se trouvant dans /etc/profile et ~/.profile, dans cet ordre. L'option -noprofile peut toujours être utilisée pour désactiver ce comportement. Quand il est invoqué en tant que shell interactif sous le nom sh, bash consulte la variable ENV, développe sa valeur si elle est définie et utilise le résultat en tant que nom de fichier à lire et exécuter. Comme un shell invoqué sous le nom sh n'essaye pas d'exécuter d'autre fichier de démarrage, l'option --rcfile n'a aucun effet. Un shell non interactif invoqué sous le nom sh ne lit aucun autre fichier d'initialisation. Quand il est invoqué sous le nom sh, bash entre en mode posix après avoir lu les fichiers d'initialisation. Quand bash est invoqué en mode posix, avec l'option -posix sur la ligne de commande, il suit ce standard en ce qui concerne les fichiers de démarrage. Dans ce cas, la variable ENV est développée, et le fichier qui en résulte est exécuté. On n'exécute pas d'autre fichier d'initialisation. Bash tente de déterminer s'il est exécuté par le démon lançant les shells distants (généralement appelé rshd ). Si bash se rend compte qu'il est exécuté par rshd, il lit et exécute les commandes de ~/.bashrc si ce fichier existe et est lisible. Il n'a pas ce comportement lorsqu'il est invoqué sous le nom sh. L'option --norc peut être utilisé pour interdire ce comportement, et l'option --rcfile permet de forcer l'utilisation d'un autre fichier, mais rshd n'utilise généralement pas ces options et ne permet pas non plus leur utilisation. Si le shell est lancé avec un identifiant effectif d'utilisateur (ou de groupe) différent de l'identifiant réel, et si l'option -p n'est pas utilisée, aucun fichier d'initialisation n'est lu, les fonctions du shell ne sont pas importées depuis l'environnement, la variable SHELLOPTS est ignorée si elle apparaît dans l'environnement, et l'identifiant effectif de l'utilisateur (du groupe) est remplacé par l'ID réel. Si l'option -p est fournie, le démarrage est le même mais l'ID effectif n'est pas modifié. DÉFINITIONSLes définitions suivantes sont utilisées tout au long de ce document.
MOTS RÉSERVÉSLes mots réservés ont une signification spéciale pour le shell. Les mots suivants sont réservés et interprétés par le shell lorsqu'ils ne sont pas protégés, et s'il s'agit soit du premier mot d'une commande simple, soit du troisième mot d'une commande case ou for (voir le paragraphe GRAMMAIRE DU SHELL ci-dessous).! case do done elif else esac fi for function if in select then until while { } time [[ ]] GRAMMAIRE DU SHELLCommandes simplesUne commande simple est une séquence d'affectations de variables facultative, suivie de mots séparés par des blancs et des redirections, et terminée par un opérateur de contrôle. Le premier mot indique la commande à exécuter. Les mots suivants sont transmis en argument à cette commande. La valeur de retour d'une commande simple est son code de sortie, ou 128+n si la commande a été interrompue par le signal n. PipelinesUn pipeline est une séquence d'une ou plusieurs commandes séparées par le caractère |. Le format d'un pipeline est :
La sortie standard de la commande_1 est connectée à l'entrée standard de la commande_2. Cette connexion est établie avant toute redirection indiquée dans une commande elle-même (voir le paragraphe REDIRECTION plus bas). Si le mot réservé ! précède un pipeline, la valeur de sortie de celui-ci sera la NÉGATION logique de la valeur de retour de la dernière commande. Sinon, le code de retour d'un pipeline sera celui de la dernière commande. L'interpréteur attend la fin de toutes les commandes du pipeline avant de renvoyer une valeur. Si le mot réservé time précède le pipeline, les temps passés par le programme en mode utilisateur et système sont indiqués quand le pipeline se termine. L'option -p change le format de sortie pour celui spécifié par POSIX. La variable TIMEFORMAT peut être affectée avec une chaîne de format indiquant comment les informations horaires doivent être affichées; consultez la descriptions de TIMEFORMAT dans VariablesduShell plus bas. Chaque commande du pipeline est exécutée comme un processus indépendant (c'est à dire dans un sous-shell). ListesUne liste est une séquence d'un ou plusieurs pipelines séparés par l'un des opérateurs ;, &, &&, ou ||, et terminée éventuellement par ;, &, ou <retour-chariot>. Dans cette liste d'opérateurs, && et || ont une précédence identique, suivis par ; et &, qui ont également une précédence identique. Si une commande se termine par l'opérateur de contrôle &, l'interpréteur l'exécute en arrière-plan, dans un sous-shell. L'interpréteur n'attend pas que la commande se termine et retourne un code 0. Les commandes séparées par un ; sont exécutées successivement, l'interpréteur attend que chaque commande se termine avant de lancer la suivante. Le code de retour est celui de la dernière commande exécutée. Les opérateurs de contrôle && et || indiquent respectivement une liste liée par un ET, et une liste liée par un OU. Une liste ET a la forme
commande_2 est exécutée si, et seulement si, commande_1 renvoie un code de retour nul. Une liste OU a la forme
commande_2 est exécutée si, et seulement si commande_1 renvoie un code de retour non-nul. La valeur de retour des listes ET et OU est celle de la dernière commande exécutée dans la liste. Commandes composéesUne commande composée est l'une des constructions suivantes :
Les opérateurs && et || n'exécutent pas expression2 si la valeur de expression1 suffit à déterminer le code de retour de l'expression conditionnelle entière.
COMMENTAIRESDans un shell non-interactif, ou dans un shell interactif avec l'option -o interactive-comments activée par la commande interne shopt (voir COMMANDES INTERNES DU SHELL plus bas), un mot commençant par # permettra d'ignorer tous les caractères restants sur la ligne. Un shell interactif sans l'option interactive-comments n'autorise pas les commentaires. L'option interactive_comments est activée par défaut dans les shells interactifs.PROTECTIONLes protections (quoting) permettent de forcer l'interpréteur à ignorer la signification spéciale de certains caractères ou mots. Les protections peuvent être utilisées pour empêcher le traitement des caractères spéciaux, éviter la reconnaissance des mots-réservés ou empêcher le développement des paramètres.Tous les méta-caractères mentionnés dans le paragraphe DÉFINITIONS plus haut ont des significations spéciales pour le shell, et doivent être protégés pour garder leur propre valeur. Il y a trois mécanismes de protection : le caractère d'échappement, les apostrophes (quote) et les guillemets (double-quote). Un caractère backslash (\), quand il n'est pas protégé, représente le caractère d'échappement. Il préserve la valeur littérale du caractère qui le suit, à l'exception du <retour-chariot>. Si une séquence \<retour-chariot> apparaît, et si le backslash n'est pas protégé, l'ensemble \<retour-chariot> est considéré comme une continuation de ligne (autrement dit, il est ignoré). Encadrer des caractères entre des apostrophes simples préserve la valeur littérale de chacun des caractères. Une apostrophe ne peut pas être placée entre deux apostrophes, même si elle est précédée d'un backslash. Encadrer des caractères entre des guillemets préserve la valeur littérale de chacun des caractères sauf $, `, et \. Les caractères $ et ` conservent leurs significations spéciales, même entre guillemets. Le backslash ne conserve sa signification que lorsqu'il est suivi par $, `, ", \, ou <fin-de-ligne>. Un guillemet peut être protégé entre deux guillemets, à condition de le faire précéder par un backslash. Les caractères spéciaux * et @ ont des significations spéciales lorsqu'ils se trouvent entre guillemets (voir le paragraphe PARAMÈTRES ci-dessous). Les mots de la forme $'chaîne' sont traités différemment. Le mot est développé en chaîne avec les séquences d'échappement remplacées par les séquences standards du C ANSI:
Le résultat après traduction est protégé par des apostrophes comme si le symbole dollar n'avait pas été présent. Une chaîne entre guillemets précédée d'un symbole dollar ($) sera traduite selon la localisation en vigueur. Si la locale courante est C ou POSIX, le symbole dollar est ignoré. Si la chaîne a subi une traduction ou des remplacements, le résultat est protégé par des guillemets. PARAMÈTRESUn paramètre est une entité permettant de stocker des valeurs, comme les variables dans les langages de programmation courants. Il peut se présenter sous forme d'un nom, d'un nombre, ou d'un des caractères spéciaux décrits plus bas, dans Paramètres Spéciaux. Au niveau du shell, une variable est un paramètre muni d'un nom.Un paramètre existe dès qu'on lui attribue une valeur. Une chaîne vide est une valeur valide. Une fois qu'une variable existe, elle ne peut être détruite qu'en utilisant la commande interne unset (voir COMMANDES INTERNES DU SHELL plus bas). Une variable peut recevoir une valeur par une affectation de la forme
Si aucune valeur n'est indiquée, la variable reçoit une chaîne vide. Toute valeur est soumise aux principes de développement du tilde, des paramètres et des variables, de la substitution de commandes, de l'évaluation arithmétique, et de la suppression des protections (voir EXPANSION plus bas). Si une variable a son attribut -i activé (voir declare plus bas, dans le paragraphe COMMANDESINTERNESDUSHELL) alors la valeur est soumise à l'évaluation arithmétique, même si la syntaxe $((...)) n'apparaît pas (voir ÉVALUATION ARITHMÉTIQUE plus bas). Les mots ne sont pas tronqués, sauf avec la séquence "$@" comme cela est expliqué dans le paragraphe Paramètres Spéciaux ci-dessous. Le développement des noms de fichiers n'est pas effectué. Paramètres PositionnelsUn paramètre positionnel est un paramètre indiqué par un ou plusieurs chiffres (à l'exception du chiffre 0 seul). Les paramètres positionnels sont remplis avec les arguments du shell lors de son invocation. Ils peuvent être modifiés avec la commande interne set. On ne peut pas utiliser d'assignation pour modifier le contenu d'un paramètre positionnel. Les paramètres positionnels sont temporairement modifiés lors de l'exécution d'une fonction du shell (voir le paragraphe FONCTIONS plus bas). Un paramètre positionnel constitué de plusieurs chiffres doit être encadré par des accolades lors de son développement (voir EXPANSION plus bas). Paramètres SpéciauxIl existe plusieurs paramètres ayant un comportement particulier. Ces paramètres peuvent uniquement être consultés, on ne peut pas les modifier.
Variables du ShellLes variables suivantes sont remplies par l'interpréteur de commandes :
Les variables suivantes sont utilisées par l'interpréteur. Dans certains cas, bash affecte des valeurs par défaut aux variables, ces cas sont décrits plus bas.
TableauxBash propose des variables tableaux à une dimension. N'importe quelle variable peut être utilisée comme tableau ; la commande interne declare peut servir à déclarer explicitement un tableau. Il n'y a pas de limite maximale à la taille d'un tableau, ni d'obligation que les membres soient indexés ou assignés de manière contigûe. Les tableaux sont indexés par des entiers en commençant à zéro.Un tableau est créé automatiquement si une variable est remplie en utilisant la syntaxe nom[index]=valeur. l'index est traîté comme une expression arithmétique, et s'évaluer en un nombre positif ou nul. Pour déclarer explicitement un tableau, on utilise declare -a nom (voir COMMANDES INTERNES DU SHELL plus bas). declare -a nom[index] est aussi accepté bien que l'index soit ignoré. Des attributs peuvent être spécifié pour une variable tableau en utilisant les commandes internes declare et readonly. Les attributs s'appliquent à tous les membres du tableau. Les tableaux sont remplis en utilisant l'affectation composée de la forme nom=(valeur_1 ... valeur_n), où chaque valeur est de la forme [index]=chaîne. Seule la chaîne est obligatoire. Si les crochets et les index optionnels sont fournis, les affectations ont lieu en conséquence ; sinon le rang de l'elément rempli est le dernier rang rempli plus un. Les index commencent à zéro. Cette syntaxed est aussi acceptée par la commande interne declare. Les éléments individuels du tableaux sont remplis en utilisant la syntaxe nom[index]=valeur présentée plus haut. Chaque élément d'un tableau peut référencé en utilisant la notation ${nom[index]}. Les accolades sont indispensables pour éviter les conflits avec le développement des noms de fichiers. Si index est @ ou *, le développement donne tous les membres de nom. Ces deux index diffèrent lorsqu'ils sont employés entre guillemets. Dans ce cas, ${nom[*]} correspond à un seul mot contenant les valeurs de tous les membres séparés par le premier caractère de la variable spéciale IFS, et ${nom[@]} développe chaque membre de nom en un mot distinct. Quant il n'y a pas de membre dans le tableau, ${nom[@]} n'a pas de valeur. Le comportement est analogue à celui des paramètres spéciaux * et @ (voir Paramètres spéciaux plus haut). ${#nom[index]} donne la longueur du membre ${nom[index]}. Si l'index est * ou @, le développement donne le nombre d'éléments dans le tableau. Référencer une variable sans index est équivalent à en référencer l'élément zéro. La commande interne unset sert à détruire les tableaux. unset nom[index] détruit l'élément de rang index. unset nom, où nom est un tableau, ou unset nom[index], avec index valant * ou @ supprimer le tableau entier. Les commandes internes declare, local, et readonly acceptent toutes une option -a pour spécifier un tableau. La commande interne read accepte une option -a pour remplir un tableau avec une liste de mots lus depuis l'entrée standard. Les commandes internes set et declare affiche les valeurs des tableaux d'une manière permettant de les réutiliser pour les affectations. EXPANSIONLes expansions sont appliquées à la ligne de commande après qu'elle ait été divisée en mots. Il existe sept types de développements : expansion des accolades, développement du tilde, remplacement des paramètres et variables, substitution de commandes, évaluation arithmétique, découpage des mots, et développement des noms de fichiers.L'ordre est : expansion des accolades, du tilde, des paramètres, des variables, des commandes, évaluation arithmétique (selon la méthode gauche-à-droite), découpage des mots et développement des noms de fichiers. Sur les systèmes qui le supportent, un développement supplémentaire a lieu : la substitution de processus. Seuls l'expansion des accolades, le découpage des mots, et le développement des noms de fichiers peuvent modifier le nombre de mots. Les autres développement transforment un mot unique en un autre mot unique. La seule exception à cette règle est l'expansion de "$@" et "${nom[@]}" comme on l'a vu plus haut (voir le paragraphe PARAMÈTRES). Expansion des accoladesL'expansion des accolades est un mécanisme permettant la création de chaînes quelconques. Il est similaire au développement des noms de fichiers, mais les noms de fichiers créés n'existent pas nécessairement. Les motifs qui seront développes prennent la forme d'un préambule facultatif, suivi d'une série de chaînes séparées par des virgules, encadrée par des accolades. Un postambule peut éventuellement suivre la série de chaînes. Le préambule est inséré devant chacune des chaînes contenues entre les accolades, et le postambule est ajouté à la fin de chacune des chaînes résultantes, le développement se faisant de gauche à droite. Plusieurs développements d'accolades peuvent être imbriqués. Les résultats de chaque développement ne sont pas triées, l'ordre gauche à droite est conservé. Par exemple a{d,c,b}e se développe en `ade ace abe'. L'expansion des accolades est effectuée en premier, et tous les caractères ayant une signification spéciale pour les autres développement sont conservés dans le résultat. Il s'agit d'une modification purement littérale. Bash n'effectue aucune interprétation syntaxique du texte entre les accolades. Une formule correcte pour le développement doit contenir des accolades ouvrantes et fermantes non protégées, et au moins une virgule non protégée. Toute formule incorrecte n'est pas développée et reste inchangée. Un { ou un , peuvent être protégés par un anti-slash pour éviter d'être considérés comme partie d'une expression entre accolades. Cette construction est généralement utilisée comme raccourci lorsque le préfixe commun aux différentes chaînes est relativement long :
Le développement des accolades induit une légère incompatibilité avec les versions traditionnelles de l'interpréteur Bourne sh. sh n'effectue aucun traitement sur les accolades ouvrantes et fermantes lorsqu'elles apparaissent dans un mot, et les laisse inchangées. Bash supprime les accolades dans les mots, après développement. Par exemple si l'on fournit à sh le mot file{1,2}, il reste inchangé en sortie. Par contre, il est transformé en file1 file2 par bash. Si une compatibilité stricte avec sh est nécessaire, lancez bash avec l'option +B ou désactivez le développement des accolades avec l'option +B de la commande set (voir le paragraphe COMMANDES INTERNES DU SHELL plus bas). Développement du TildeSi un mot commence avec le caractère tilde (`~'), tous les caractères précédant le premier slash non protégé (voire tous les caractères s'il n'y a pas de slash), sont considérés comme un préfixe tilde. Si aucun caractère du préfixe tilde n'est protégé, les caractères suivant le tilde sont traités comme un nom de login possible. Si ce nom de login est une chaîne nulle, le tilde est remplacé par la valeur du paramètre HOME. Si HOME n'existe pas, le tilde est remplacé par le répertoire de connexion de l'utilisateur exécutant le shell. Si le préfixe tilde est remplacé par le répertoire personnel associé au nom de login en question. Si le préfixe tilde est `+', la valeur du paramètre shell PWD le remplace. Si le préfixe tilde est `-', la valeur du paramètre shell OLDPWD lui est substitué. Si les caractères à la suite du tilde dans le préfixe tilde représentent un nombre N préfixé éventuellement d'un `+' ou d'un `-' le préfixe tilde est remplacé par l'élément correspondant de la pile de répertoires telle qu'il serait affiché par la commande interne dirs invoquée avec le préfixe tilde en argument. Si les caractères à la suite du tilde dans le préfixe tilde représentent un nombre sans signe, on suppose qu'il s'agit de `+'. Si le nom est invalide, ou si le développement du tilde échoue, le mot est inchangé. Chaque affectation de variable est soumis au développement du tilde s'il suit immédiatement un : ou un =. On peut donc utiliser des chemins d'accès avec un tilde pour remplir les variables PATH, MAILPATH, et CDPATH, et le shell fournira la valeur correcte. Remplacement des paramètresLe caractère `$' permet d'introduire le remplacement des paramètres, la substitution de commandes, ou l'expansion arithmétique. Le nom du paramètre ou du symbole à développer peut être encadré par des accolades, afin d'éviter que les caractères suivants ne soient considérés comme appartenant au nom de la variable. Lorsque les accolades sont utilisées, l'accolade finale est le premier caractère `}' non protégé par un antislash ni inclus dans une chaîne protégé, ni dans une expresssion arithmétique, une substitution de commande ou un développement de paramètre.
Si le premier caractère du paramètre est un point d'exclamation, un niveau d'indirection de variable est introduit. Bash utilise la valeur de la variable formée par le reste du paramètre comme un nom de variable. Cette variable est alors développée et la valeur utilisée pour le reste de la substitution plutôt que la valeur du paramètre lui-même. On appelle ce mécanisme le développement indirect. Dans chacun des exemples suivants, le mot est soumis au développement du tilde, au remplacement des paramètres, à la substitution de commandes, et à l'évaluation arithmétique. Bash vérifie si un paramètre existe, et s'il n'est pas nul. L'omission du double point ne fournit qu'un test d'existence.
Substitution de commandesLa substitution de commandes permet de remplacer le nom d'une commande par son résultat. Il en existe deux formes :
Bash effectue la substitution en exécutant la commande et en la remplaçant par sa sortie standard, dont les derniers sauts de lignes sont supprimés. Les sauts de lignes internes ne sont pas supprimés mais peuvent disparaître lors du découpage en mots. La substitution de commande $(cat fichier) peut être remplacée par l'équivalent plus rapide $(< fichier). Quand l'ancienne forme de substitution avec les backquotes ` est utilisée, le caractère antislash garde sa signification littérale, sauf s'il est suivi de $, `, ou \. La première backquote non protégée par un antislash termine la substitution de commande. Quand on utilise la forme $(commande), tous les caractères entre parenthèses gardent leurs valeurs littérales. Aucun n'est traité spécialement. Les substitutions de commandes peuvent être imbriquées. Avec l'ancienne forme, il faut protéger les backquotes internes avec un backslash. Si la substitution apparaît entre guillemets, le découpage des mots, et l'expansion des noms de fichiers ne sont pas effectués. Évaluation ArithmétiqueL'évaluation arithmétique permet de remplacer une expression par le résultat de son évaluation. Le format d'évaluation arithmétique est :
L'expression est manipulée de la même manière que si elle se trouvait entre guillemets, mais un guillemet se trouvant entre les parenthèses n'est pas traité spécifiquement. Tous les mots de l'expression subissent le développement des paramètres, la substitution des commandes et la suppression des apostrophes et guillemets. Les évaluations arithmétiques peuvent être imbriquées. L'évaluation est effectuée en suivant les règles mentionnées dans le paragraphe CALCULARITHMÉTIQUE. Si l'expression est invalide, bash affiche un message indiquant l'erreur, et aucune substitution n'a lieu. Substitution de ProcessusLa substitution de processus n'est disponible que sur les systèmes acceptant le mécanisme des tubes nommés (FIFOs) ou la méthode /dev/fd de noms de fichiers Elle prend la forme <(liste) ou >(liste). La liste de processus est exécutée avec ses entrées et sorties connectée à une FIFO ou à un fichier dans /dev/fd. Le nom de ce fichier est passé en argument à la commande qui sera exécutée comme résultat de cette substitution. Si on utilise la forme >(liste), l'écriture dans le fichier fournira des entrées pour la liste. Si la forme <(liste) est utilisée, le fichier passe en argument devra être lu pour obtenir la sortie de la liste. Sur les systèmes qui le permettent, la substitution de processus est effectuée simultanément au remplacement des paramètres et variables, a la substitution de commande, et à l'évaluation arithmétique. Séparation des motsLes résultats du remplacement des paramètres, de la substitution de commandes, et de l'évaluation arithmétique, qui ne se trouvent pas entre guillemets sont analysés par le shell afin d'appliquer le découpage des mots. L'interpréteur considère chaque caractère du paramètre IFS comme un délimiteur, et redécoupe le résultat des transformations précédentes en fonction de ceux-ci. Si la valeur du paramètre IFS est exactement <espace><tabulation><retour-chariot>, (la valeur par défaut), alors toute séquence de caractères IFS sert à délimiter les mots. Si IFS a une valeur autre que celle par défaut, alors les séquences de caractères blancs espace et tabulation sont ignorées en début et fin de mot, à condition que ces caractères blancs se trouvent dans la valeur de IFS (un caractère de IFS blanc). Tout autre caractère de IFS se trouvant à côté d'un caractère blanc de IFS, sert à délimiter un champ. Une séquence de caractères blancs de IFS est également traitée comme un séparateur. Si la valeur de IFS est nulle, aucun découpage de mot n'a lieu. Les arguments nuls explicites ("" ou '') sont conservés. Les arguments nuls implicites, résultant du développement des paramètres n'ayant pas de valeurs, sont éliminés. Si un paramètre sans valeur est développé entre guillemets, le résultat est un argument nul qui est conservé. Notez que si aucun développement n'a lieu, le découpage des mots n'est pas effectué. Développement des noms de fichiersAprès le découpage des mots, et si l'option -f n'est pas indiquée, bash recherche dans chaque mot les caractères *, ?, (, et [. Si l'un d'eux apparaît, le mot est considéré comme un motif, et remplacé par une liste, classée par ordre alphabétique, des noms de fichiers correspondant à ce motif. Si aucun nom de fichiers ne correspond, et si l'option shell nullglob n'est pas active, le mot reste inchangé. Si l'option nullglob est active, et si aucune correspondance n'est trouvée, le mot est supprimé. Si l'option shell nocaseglob est activée, la correspondance a lieu sans tenir compte des différences majuscules / minuscules. Quand un motif est utilisé pour créer des chemins d'accès, le caractère ``.'' au début d'un nom, ou immédiatement à la suite d'un slash doit être explicitement mis en correspondance, à moins que l'option shell dotglob ne soit active. Le caractère slash doit toujours être mis en correspondance explicitement. Dans tous les autres cas, le caractère ``.'' n'est pas traité spécifiquement. Voyez la description de la commande shopt dans COMMANDES INTERNES DU SHELL pour une description des options shell nocaseglob, nullglob, et dotglob. la variable shell GLOBIGNORE peut servir à restreindre l'ensemble des noms de fichiers correspondant à un motif. Si GLOBIGNORE est remplie, chaque nom de fichier qui correspond aussi à un motif de GLOBIGNORE est supprimé de la liste des correspondances. Les noms de fichiers ``.'' et ``..'' sont toujours ignorés, même quand GLOBIGNORE est remplie. Toutefois, configurer GLOBIGNORE a pour effet d'activer l'option shell dotglob, ainsi tous les autres noms de fichiers commençant par ``.'' correspondront. Pour obtenir l'ancien comportement ignorant les noms commençant par ``.'', placez ``.*'' dans l'un des motifs de GLOBIGNORE. L'option dotglob est désactivée si la variable GLOBIGNORE n'existe pas. Motifs génériques Tout caractère apparaissant dans un motif, hormis les caractères spéciaux décrits ci-après correspond à lui-même. Le caractère NUL ne peut pas se trouver dans un motif. Les caractères spéciaux doivent être protégés si ils doivent se correspondre littéralement. Les caractères spéciaux ont les significations suivantes :
Si l'option extglob du shell option est activée par la commande shopt plusieurs opérateurs de correspondance étendue sont reconnus. Dans la description suivante, une liste-motif est une liste d'un ou plusieurs motifs séparés par des |. Les motifs composés sont formés en utilisant un ou plusieurs sous-motifs comme suit :
Suppression des protectionsAprès les développements précédents, toutes les occurrences non-protégées des caractères \, `, et " qui ne résultent pas d'un développement sont supprimées. REDIRECTIONAvant qu'une commande ne soit exécutée, il est possible de rediriger son entrée et sa sortie en utilisant une notation spéciale interprétée par le shell. Les redirections peuvent également servir à ouvrir ou fermer des fichiers dans l'environnement actuel du shell. Les opérateurs de redirection décrits ci-dessous peuvent apparaître avant, ou au sein d'une commande simple ou suivre une commande. Les redirections sont traitées dans l'ordre d'apparition de gauche à droite.Dans les descriptions suivantes, si le numéro de descripteur de fichier est omis, et si le premier caractère de l'opérateur de redirection est <, celui-ci correspondra à l'entrée standard (descripteur de fichier 0). Si le premier caractère de l'opérateur est >, la redirection s'appliquera à la sortie standard (descripteur de fichier 1). Le mot qui suit l'opérateur de redirection dans les descriptions suivantes est soumis à l'expansion des accolades, du tilde, des paramètres, à la substitution de commandes, à l'évaluation arithmétique, à la suppression des protections, et au développement des noms de fichiers. S'il se modifie pour donner plusieurs mots, bash détectera une erreur. Remarquez que l'ordre des redirections est important. Par exemple, la commande
redirige a la fois la sortie standard et la sortie d'erreur vers le fichier liste_répertoires, alors que la commande
ne redirige que la sortie standard vers le fichier liste_répertoires, car la sortie d'erreur a été renvoyée vers la sortie standard avant que celle-ci ne soit redirigée vers liste_répertoires. Une erreur d'ouverture ou de création de fichier peut déclencher un échec. Redirection d'entréeLorsque l'on applique une redirection d'entrée, le fichier dont le nom résulte du développement du mot sera ouvert en lecture avec le descripteur de fichier numéro n, ou en tant qu'entrée standard (descripteur de fichier 0) si n n'est pas mentionné. Le format général des redirections d'entrée est le suivant :
Redirection de sortieLors d'une redirection de sortie, le fichier dont le nom résulte du développement du mot est ouvert en écriture, avec le descripteur de fichier n, ou en tant que sortie standard (descripteur de fichier 1) si n n'est pas mentionné. Si le fichier n'existe pas, il est créé. S'il existait déjà, sa taille est ramenée à 0. Le format général des redirections de sortie est le suivant :
Si l'opérateur de redirection est >, et si l'option noclobber de la commande interne set est activée, la redirection échouera si le fichier dont le nom résulte du développement du mot existe et est un fichier régulier. Si l'opérateur de redirection est >|, ou l'opérateur > avec l'option noclobber de la commande interne set n'est pas activée, la redirection sera tentée même si le fichier dont le nom résulte du développement du mot existe. Redirection pour Ajout en SortieLorsqu'on redirige ainsi la sortie, le fichier dont le nom résulte du développement du mot est ouvert pour ajout en fin de fichier, avec le descripteur n, ou en tant que sortie standard (descripteur 1) si n n'est pas mentionné. Si le fichier n'existe pas, il est créé. Le format général pour la redirection de sortie avec ajout est :
Redirection de la sortie standard et de la sortie d'erreurBash permet la redirection simultanée de la sortie standard (descripteur 1) et de la sortie d'erreur (descripteur 2), dans un fichier dont le nom est le résultat du développement du mot avec cette construction. Il y a deux formes pour effectuer cette double redirection :
On préfère généralement la première. Elle est sémantiquement équivalente à
Document en ligneAvec ce type de redirection, le shell va lire son entrée standard jusqu'à ce qu'il atteigne une ligne contenant uniquement le mot prévu (sans espaces à la suite), nommée étiquette. Une fois cette étiquette atteinte, il exécutera la commande demandée en lui fournissant en entrée le texte lu avant l'étiquette, que l'on appelle document en ligne. Le format des documents en ligne est le suivant :
Il n'y a ni remplacement de paramètre, ni substitution de commande, ni développement de chemin d'accès, ni évaluation arithmétique sur le mot. Si l'un des caractères du mot est protégé, l' étiquette est obtenue après suppression des protections dans le mot, et les lignes du document ne sont pas développées. Sinon, toutes les lignes du document sont soumises au remplacement des paramètres, à la substitution de commandes, et à l'évaluation arithmétique. Dans ce dernier cas, les couples \<retour-chariot> sont ignorés, et \ doit être utilisé pour protéger les caractères \, $, et `. Si l'opérateur de redirection est <<-, alors les tabulations en tête de chaque ligne sont supprimées, y compris dans la ligne contenant étiquette. Ceci permet d'indenter de manière naturelle les documents en ligne au sein des scripts. Dédoublement de descripteur de fichierL'opérateur de redirection
permet de dupliquer les descripteurs de fichiers en entrée. Si le mot se transforme en un ou plusieurs chiffres, le descripteur de fichier n devient une copie de ce descripteur. Si les chiffres du mot ne correspondent pas à un descripteur en lecture, une erreur se produit. Si le mot prend la forme -, le descripteur n est fermé. Si n n'est pas mentionné, on utilise l'entrée standard (descripteur 0). L'opérateur
est utilisé de manière similaire pour dupliquer les descripteurs de sortie. Si n n'est pas précisé, on considère la sortie standard (descripteur 1). Si les chiffres du mot ne correspondent pas à un descripteur en écriture, une erreur se produit. Un cas particulier se produit si n est omis, et si mot ne se développe pas sous forme de chiffres. Alors, les sorties standard et d'erreurs sont toutes deux redirigées comme précédemment. Ouverture en Lecture/Écriture d'un descripteur de fichierL'opérateur de redirection
ouvre le fichier dont le nom résulte du développement du mot, à la fois en lecture et en écriture et lui affecte le descripteur de fichier n, ou bien le descripteur 0 si n n'est pas mentionné. Si le fichier n'existe pas, il est créé. ALIASLes alias permettent de substituer une chaîne à un mot lorsqu'il est utilisé comme premier mot d'une commande simple. L'interpréteur gère une liste d'alias qui peuvent être créés et détruits avec les commandes internes alias et unalias (voir le paragraphe COMMANDES INTERNES DU SHELL plus bas). Le shell vérifie si le premier mot de chaque commande (s'il n'est pas protégé) est un alias. Si tel est le cas, ce mot est remplacé par le texte de l'alias. Le nom de l'alias, ainsi que le texte de remplacement, peuvent contenir n'importe quels caractères valides pour le shell, y compris les méta-caractères présentés plus haut. Une exception toutefois, le nom de l'alias ne peut pas contenir de caractère =. Le shell vérifie si le premier mot du texte de remplacement est à son tour le nom d'un alias, mais s'il est identique au nom de l'alias il ne sera pas remplacé à nouveau. Ceci permet de créer un alias ls valant ls -F, par exemeple, que bash n'essaiera pas de développer récursivement. Si le dernier caractère du texte de remplacement est un blanc, alors on vérifiera également si le mot suivant l'alias est lui aussi un alias.Les alias sont créés et affichés avec la commande alias, et supprimés avec la commande unalias. Il n'existe pas de mécanisme permettant d'utiliser des arguments dans le texte de remplacement. Si on en a besoin, il faut utiliser une fonction du shell. Les alias ne sont développés qu'avec les shells interactifs sauf si l'option expand_aliases du shell est activée par la commande shopt (voir la description de shopt au paragraphe COMMANDES INTERNES DU SHELL plus bas) Les règles concernant la définition et l'utilisation des alias sont un peu confuses. Bash lit toujours au moins une ligne d'entrée complètement avant d'exécuter une commande de cette ligne. Les alias sont traités lorsque la commande est lue, et non pas lorsqu'elle est exécutée. Ainsi, une définition d'alias apparaissant sur la même ligne qu'une autre commande ne prend pas effet avant la lecture de la prochaine ligne d'entrée. Autrement dit, une commande placée à la suite d'une définition d'alias, sur la même ligne ne sera pas affectée par cet alias. Ce comportement est également important lors de l'exécution des fonctions. Les alias sont traités lorsque la définition de la fonction est lue, et non pas lors de l'exécution de cette fonction. Ainsi des alias définis dans une fonction ne sont pas actifs avant la fin de l'exécution de la fonction. Pour plus de tranquillité, placez toujours les définitions d'alias sur des lignes isolées, et n'utilisez jamais la commande alias dans les commandes composées. Notez enfin que la plupart du temps les alias sont avantageusement remplacés par des fonctions du shell. FONCTIONSUne fonction du shell mémorise une série de commandes pour permettre une exécution ultérieure. Leurs definition est décrite plus haut, dans GRAMMAIREDUSHELL. Les fonctions sont exécutées dans le contexte de l'interpréteur en cours. On ne crée pas de nouveau processus pour interpréter une fonction, contrairement à l'exécution d'un script. Les arguments d'une fonction sont placés dans les paramètres positionnels durant son exécution. Le paramètre spécial # est mis a jour. Le paramètre positionnel 0 n'est pas modifié. Les autres aspects de l'environnement d'exécution du shell sont identiques entre l'intérieur de la fonction et le corps appelant du programme, à l'exception de la gestion de DEBUG (voir la description de la commande interne trap au paragraphe SHELL BUILTIN COMMANDS plus bas) qui n'est pas héritée.Les variables locales d'une fonction peuvent être déclarées avec la commande local. Autrement, les variables et leurs valeurs sont partagées entre la fonction et son appelant. Si la commande interne return est exécutée dans une fonction, celle-ci se termine et l'exécution reprend avec la commande suivant l'appel de fonction. Quand une fonction se termine, les paramètres positionnels et le paramètre spécial # reprennent les valeurs qu'ils avaient avant l'appel de fonction. Les noms des fonctions et leurs définitions sont affichés avec l'option -f des commandes internes declare ou typeset. Les options -F de declare ou typeset n'afficheront que les noms des fonctions. Les fonctions peuvent être exportées automatiquement avec l'option -f de la commande interne export, afin de rester définies dans les sous-shells. Les fonctions peuvent être récursives. Aucune limite n'est imposée quant au nombre d'appels récursifs. CALCUL ARITHMÉTIQUELe shell permet, dans certaines circonstances, l'évaluation d'expressions arithmétiques (voir la commande interne let ainsi que le paragraphe Évaluation Arithmétique). L'évaluation est effectuée en utilisant des entiers longs, sans vérification du débordement. Néanmoins la division par 0 est détectée et renvoie une erreur. La liste des opérateurs ci-dessous est constituée par des groupes de précédence identique. Les niveaux sont classés en ordre de précédence décroissante.
On peut utiliser les variables du shell comme opérandes, le développement des paramètres étant effectué avant l'évaluation arithmétique. Les valeurs des paramètres sont converties en entiers longs dans les expressions. Une variable shell n'a donc pas besoin d'avoir l'attribut "entier" pour être utilisable dans un calcul. Les constantes commençant par un 0 sont interprétées comme des nombres octaux. Un entête 0x ou 0X indique une valeur hexadécimale. Sinon, les nombres ont la forme [base#]n, ou la base arithmétique est un nombre décimal entre 2 et 36, et n le nombre lui-même exprimé dans cette base. Si la base n'est pas mentionnée, le nombre est considéré comme décimal. Les chiffre supérieurs à 9 sont représentés par les lettres minuscules, les lettres majuscules, le _ et le @, dans cet ordre. Si la base est inférieure ou égale à 36 les minuscules et les majuscules peuvent être utilisées de manière interchangeable pour représenter les nombres entre 10 et 35. Les opérateurs sont évalués dans l'ordre de précédence. Les sous-expressions entre parenthèses sont évaluées en premier, ce qui permet de surpasser les règles de précédence. EXPRESSIONS CONDITIONNELLESLes expressions conditionnelles sont utilisées par la commande composée [[ et les commandes internes test et [ pour vérifier l'état d'un fichier et assurer des comparaisons arithmétiques ou sur des chaînes. Les expressions se forment à partir des opérateurs unaires ou binaires suivants. Si un argument fichier est de la forme /dev/fd/n, alors il représente le descritpeur de fichier n.
DÉVELOPPEMENT DES COMMANDES SIMPLESLors de l'exécution d'une commande simple, le shell effectue les développements affectations, et redirections de gauche à droite, suivants.
Si aucun nom de commande ne résulte des précédentes opérations, les assignations de variable modifie l'environnement en cours. Sinon elles sont ajoutées à celui de la commande exécutée et ne modifient pas l'environnement du shell. Si l'une des tentatives d'affectation concerne une variable en lecture seule, une erreur se produit, et la commande se termine sur un code non-nul. Si aucun nom de commande n'est obtenu, les redirections sont réalisées mais ne modifient pas l'environnement du shell en cours. Une erreur de redirection renvoie un code de retour non-nul. S'il reste un nom de commande après l'expansion, l'exécution a lieu comme décrit ci-dessous. Sinon la commande se termine. Si l'un des développement contient une substitution de commande, le code de retour est celui de la dernière substitution de commande réalisée. S'il n'y en a pas, la commande se termine avec un code de retour nul. EXÉCUTION DES COMMANDESAprès le découpage de la ligne de commande en mots, si le résultat est une commande simple suivie d'une éventuelle liste d'arguments, les actions suivantes sont effectuées.Si le nom de la commande ne contient pas de slash, le shell tente de la trouver. S'il existe une fonction shell de ce nom, elle est appelée comme nous l'avons vu dans le paragraphe FONCTIONS plus haut. Si le nom n'est pas celui d'une fonction, l'interpréteur le recherche dans la liste des fonctions internes. Si une équivalence est trouvée, la fonction interne est invoquée. Si le nom n'est ni celui d'une fonction shell, ni celui d'une commande interne, et s'il ne contient pas de slash, bash va chercher dans chacun des membres de PATH un répertoire contenant un fichier exécutable du nom désiré. Bash utilise une table de hachage pour mémoriser les noms d'accès complets des fichiers (voir la commande hash au paragraphe COMMANDES INTERNES DU SHELL plus bas). Une recherche complète dans les répertoires du PATH n'est entreprise que si la commande ne se trouve pas dans la table de hachage. Si la recherche est infructueuse, l'interpréteur affiche un message d'erreur et renvoie un code de retour valant 127. Si la recherche réussit, ou si le nom de la commande contient au moins un slash, le shell exécute le programme voulu dans un environnement distinct. L'argument 0 est rempli avec le nom fourni, et les autres arguments seront éventuellement remplis avec le reste de la ligne de commande. Si l'exécution échoue parce que le programme n'est pas un exécutable, et si le fichier n'est pas un répertoire, on le considère alors comme un script shell, un fichier contenant une série de commandes. Un sous-shell est alors créé pour exécuter ce script. Ce sous-shell se réinitialisera lui-même, comme si un nouveau shell avait été invoqué pour exécuter le script, à la différence qu'il continuera à mémoriser l'emplacement des commandes connues de son parent (voir hash dans le paragraphe COMMANDES INTERNES DU SHELL plus bas). Si le programme est un fichier commençant par #!, le reste de la première ligne indique un interpréteur pour ce programme. Le shell se chargera d'exécuter cet interpréteur, si le système d'exploitation ne gère pas lui-même ce format d'exécutable. Les arguments de l'interpréteur consistent en un premier argument éventuel fourni sur la première ligne du fichier à la suite du nom de l'interpréteur, suivi du nom du programme, suivi des arguments de la commande s'il y en a. ENVIRONNEMENT D'EXÉCUTION DES COMMANDESLe shell fournit un environnement d'exécution consistant en l'ensemble des éléments suivants :
Lorsqu'une commande autre qu'une fonction interne ou une fonction du shell doit être exécutée, elle est invoquée dans un environnement d'exécution séparé constitué de ce qui suit. Sauf indication contraire, les valeurs sont héritées de l'environnement du shell.
Une commande invoquée dans un environnement distinct ne peut pas affecter l'environnement d'exécution du shell. Les substitutions de commandes et les commandes asynchrones sont invoquées dans un environnement de sous-shell qui est une copie de celui du shell, sauf que les signaux capturés par le shell reprennent le comportement qu'ils avaient au lancement du shell. Les fonctions internes invoquées dans un pipeline sont aussi exécutées dans un environnement de sous-shell. Les modifications apportées à l'environnement d'un sous-shell n'affectent aucunement l'environnement du shell. ENVIRONNEMENTQuand un programme est invoqué, il reçoit un tableau de chaînes que l'on appelle environnement. Il s'agit d'une liste de paires nom-valeur, de la forme nom=valeur.Le shell permet de manipuler l'environnement de plusieurs façons. Au démarrage, le shell analyse son propre environnement, et crée un paramètre pour chaque nom trouvé, en le marquant comme exportable vers les processus fils. Les commandes exécutées héritent de cet environnement. Les commandes export et declare -x permettent d'ajouter ou de supprimer des paramètres ou des fonctions de l'environnement. Si la valeur d'un paramètre de l'environnement est modifiée, la nouvelle valeur devient une partie de l'environnement, et elle remplace l'ancienne. L'environnement hérité par les commandes exécutées est l'environnement initial du shell (dont les valeurs peuvent être modifiées), moins les éléments supprimés par la commande unset, plus les éléments ajoutés par les commandes export et declare -x. L'environnement d'une commande simple ou d'une fonction peut être augmenté temporairement en la faisant précéder d'une affectation de paramètre, comme nous l'avons vu au paragraphe PARAMÈTRES. Ces affectations ne concernent que l'environnement vu par cette commande ou fonction. Si l'option -k est utilisée (voir la commande interne set plus bas), alors toutes les affectations de paramètres sont placées dans l'environnement d'une commande exécutée, pas seulement celles qui précèdent son nom. Quand bash invoque une commande externe, la variable _ contient le chemin d'accès complet à cette commande, et elle est transmise dans l'environnement. CODE DE RETOURAu niveau du shell, une commande qui se termine avec un code de retour nul est considérée comme réussie. Le zéro indique le succès. Un code de retour non-nul indique un échec. Quand une commande se termine à cause d'un signal fatal, bash utilise la valeur 128+signal comme code de retour.Si une commande n'est pas trouvée, le processus fils créé pour l'exécuter renvoie la valeur 127. Si la commande est trouvée mais pas exécutable, la valeur renvoyée est 126. Si une commande échoue à cause d'une erreur survenue lors du développement ou de la mise en place des redirections, le code de retour est supérieur à zéro. Les fonctions interne renvoient zéro (vrai) si elles réussissent et une valeur non nulle (faux) si une erreur se produit durant leur exécution. Toutes les fonctions internes renvoient 2 en cas d'erreur de syntaxe. Bash lui-même renvoie le code de retour de la dernière commande exécutée, à moins qu'une erreur de syntaxe ne se produise, auquel cas il renvoie une valeur non-nulle. Voir également la commande interne exit plus bas. SIGNAUXQuand bash fonctionne de manière interactive, il ignore le signal SIGTERM (c'est pourquoi kill 0 ne tue pas un shell interactif), et le signal SIGINT est intercepté et géré (c'est pourquoi la commande interne wait n'est pas interruptible). Dans tous les cas, bash ignore le signal SIGQUIT. Si le contrôle de jobs est disponible, bash ignore les signaux SIGTTIN, SIGTTOU, et SIGTSTP.Les jobs synchrones lancés par bash reçoivent les valeurs des signaux héritées par le shell de leur parent. Quand le contrôle de job n'est pas actif, les jobs en arrière-plan ignorent les signaux SIGINT et SIGQUIT également. Les commandes exécutées en tant que résultat de la substitution de commandes ignorent les signaux de contrôle de jobs émis par le clavier SIGTTIN, SIGTTOU, et SIGTSTP. Par défaut, le shell se termine à la réception de SIGHUP. Avant de se terminer, il renvoie SIGHUP à tous les jobs en cours ou arrêtés. Les jobs arrêtés reçoivent aussi SIGCONT pour s'assurer qu'il recevront bien le SIGHUP. Pour empêcher le shell d'envoyer ce signal à un job particulier, il faut le retirer de la table des jobs à l'aide de la commande interne disown (voir FONCTIONS INTERNES DU SHELL plus bas) ou le marquer comme exempté de SIGHUP avec disown -h. Si l'option du shell huponexit a été activée avec la fonction shopt, bash envoie un signal SIGHUP à tous les jobs lorsqu'un shell de login interactif se termine. Lorsque bash reçoit un signal qu'il doit capturer, et qu'il attend la fin d'une commande, le gestionnaire de signal ne sera pas exécuté avan | ||||||