Sous bash, comme sous tous les interpréteurs de commandes, entre le moment où une commande est validée par l'utilisateur (en appuyant sur la touche <ENTRÉE>) et où elle est exécutée, se produit une phase de traitement pendant laquelle ont lieu des substitutions de texte.
Ces plases sont, dans l'ordre :
info emacs
, et
voir l'item « Shell
expansions ».
L'expansion des accolades est un mécanisme purement syntaxique
(qui ne dépend pas de l'existence, dans le système, d'objets
portant les noms manipulés). Elle consiste à remplacer une
séquence de caractères : avant{a,b,c}après
par les séquences : avantaaprès
,
avantbaprès
et avantcaprès
,
séparées par des espaces.
Exemple : mkdir
/net/i1/login/projet/{src/{module1,module2},lib,bin}
.
On peut le tester en faisant un echo
de la
chaîne ci-dessus.
La substitution est faite même si les noms de fichiers ci-dessus n'existent pas encore, à la différence d'avec la substitution des noms de fichiers que l'on verra après. C'est même l'avantage pour les créer, comme dans l'exemple ci-dessus.
Déjà vue. Remplace la chaîne ~login
par le
répertoir d'accueil de l'utilisateur login
,
soit, pour un I1, le répertoire : /net/i1/login
.
Permet le remplacement des noms de variables d'environnement
par leur valeur. Les noms de variables à substituer peuvent
être de la forme $NOM
ou bien ${NOM}
.
Par exemple : echo $PATH
, ou bien
echo ${PATH}
.
La deuxième forme permet d'insérer des options supplémentaires, comme par exemple de mettre une chaîne par défaut si le nom de variable n'est pas connu de l'interpréteur. Exemple :
% echo ${BROL:-Je ne le connais pas}
Je ne le connais pas
% export BROL="Monsieur Brol"
% echo ${BROL:-Je ne le connais pas}
Monsieur Brol
Pour plus d'informations sur toutes les possibilités et noms
de variables spéciales, voir info bash
.
Les suites de texte entre apostrophes inverses sont remplacées par le résultat de l'exécution de la commande correspondante dans un sous-shell.
Par exemple :
% export VAR=`date`
% echo $VAR
Toute séquence de blancs (espaces, tabulations, ou retours de ligne) sert de délimiteur entre chaque mot (paramètre, option) de la commande.
Pour garder des espaces dans un mot, on peut utiliser le
caractère d'échappement "\", comme dans
mkdir brol\ et\ trol
, qui permet de manipuler des
noms de fichiers avec des espaces. Voir que l'interpréteur
met lui-même des backslash lors de la complétion de nom
de commande (touche <TAB>).
On peut aussi mettre une chaîne contenant des espaces entre simples quotes (pas d'interprétation du tout de son contenu) ou entre double quotes (interprétation de son contenu). Exemple :
% echo "$BROL et trol"
Monsieur Brol et trol
% echo '$BROL et trol'
$BROL et trol
Chacun des mots de la commande est analysés à la recherche des caractères '*', '?' et '['. S'ils sont trouvés, alors le mot est considéré comme un motif de noms de fichier, et il est remplacé par la suite triée alphabétiquement des noms de fichiers correspondant au motif.
Le sens des caractères de motif est le suivant :
*
?
[...]
a-i
;
Exemple : ls -l /usr/lib/lib[a-jt-z]??e*
.
On a vu comment traiter le cas embêtant des espaces dans les noms de fichiers grâce au backslash ou à la mise entre apostrophes.
Un autre problème est d'avoir un nom de fichier commenant
par un tiret. Si on spécifie le nom de fichier tel quel,
il est pris pour une option, et les commandes diront
qu'elles ne connaissent pas cette option. Par exemple :
touch -brol
.
Une solution possible consiste à préfixer le nom de fichier
par un nom de chemin, pour que le premier caractère ne soit
plus un tiret, comme par exemple dans
touch ./-brol
.
Sinon, de nombreuses commandes de l'environnement GNU ont
comme option particulière le double tiret, qui spécifie
que tout ce qui se trouve après n'est plus une option
mais un nom de fichier. On peut donc, sous un environnement
GNU, taper : touch -- -brol
.
Tous les processus UNIX possèdent trois flots de données stnadards :
Sous bash, l'utilisateur dispose de plusieurs mots clés pour spécifier les redirections associées à sa ou ses commandes :
nom de fichier
nom de fichier
nom de fichier
nom de fichier
commande1
| commande2
commande1
et l'entrée standard de la
commande2
.
num1
>& num2
num1
vers la destination du
flot de numéro num2
. L'usage le plus courant est de
rediriger la sortie d'erreur vers la sortie standard, avant de faire
un pipe, par exemple : 2>&1
.
> fichier 2>&1
renvoie les deux flots de sortie
vers le même fichier, alors que 2>&1 > fichier
renvoie le flot de sortie d'erreur vers la destination du flot de
sortie standard avant de rediriger le flot de sortie standard vers
le fichier donné.