Vous n'êtes pas identifié(e).
L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT →
Ceci est une ancienne révision du document !
Voici une étude du Bash qui prend comme entrée les différents caractères.
Plus précisément, j'ai suivi la page man bash et j'ai tenté d'en expliquer et d'en illustrer le détail par des exemples.
Cette étude est développée sur huit wiki (voir la liste ci-dessous), elle se veut à la fois progressive et synthétique.
Si vous êtes débutant, suivez la progression, si vous cherchez un simple rappel, consultez les tableaux récapitulatifs de chacune des parties suivantes :
1) Intro I : C'est ici !
2) chap II : Bash : Détail et caractères
3) chap III : Bash : les opérateurs lexicographiques
4) chap IV : Bash : les opérateurs de comparaison numérique
5) chap V : Bash : les symboles dans les calculs
6) chap VI : Bash : les tableaux
7) chap VII : Bash : les caractères de transformation de parametres
8) chap VIII : Bash : globs étendus et regex
Enfin, les liens en gras renvoient aux pages du wiki qui sont relatifs au shell, terminal, chemin relatif et absolu, scripts, alias, etc.
Dans cette introduction :
Yep ! C'est parti !
Le shell (« coquille » en anglais) est une couche logicielle qui fournit l'interface utilisateur d'un système d'exploitation. Il correspond à la couche la plus externe de ce dernier. Il se présente sous la forme d'une interface en ligne de commande accessible depuis la console ou un terminal. L'utilisateur lance des commandes sous forme d'une entrée texte exécutée ensuite par le shell.
Le shell bash est l'un des shell utilisé sous gnu/linux. Pour un historique voir : http://fr.wikipedia.org/wiki/Shell_Unix#Historique_des_shell_Unix
Qui dit shell, dit commandes, avant tout : Utiliser GNU/Linux en ligne de commande, tout commence là !.
Il existe plusieurs shell, bien souvent par défaut, c'est le Shell Bash qui est utilisé.
Pour savoir quel shell vous utilisez par défaut, tapez :
user@debian-facile:~$ echo $SHELL /bin/bash
Pour connaître la version de votre Shell Bash, tapez :
user@debian-facile:~$ bash --version GNU bash, version 3.2.39(1)-release (i486-pc-linux-gnu) Copyright (C) 2007 Free Software Foundation, Inc.
Distinguons maintenant les commandes internes et les commandes externes au shell bash, commandes simples et les commandes composées.
Une commande interne est une commande dont le code est implanté au sein du shell.
Les commandes sont intégrées, soit pour des raisons de performances (l'appel d'une telle commande ne crée pas de processus fils du shell courant); soit parce qu'une commande intégrée se sert des variables internes du shell.
Cela signifie que lorsqu'on change de shell courant (par exemple bash ou C-shell2), on ne dispose plus des mêmes commandes internes.
Néanmoins, les commandes courantes qui sont essentielles à l'utilisateur, se retrouvent sous les différents shell des distributions Linux.
help
Pour afficher une aide sommaire sur une commande interne :
help nom_commande
Une commande externe est une commande dont le code se trouve dans un fichier ordinaire.
- /bin
(ls bin affiche la liste des commandes externes usuelles communes à tous les utilisateurs.)
- /sbin
(ls /sbin, affiche la liste des commandes externes usuelles réservées à l'administrateur (root).
- /usr/sbin/
- /usr/bin
(les répertoires /usr/bin/ et /usr/sbin/ contiennent les commandes externes moins fréquemment utilisées.)
whereis nom_commande
- affiche le chemin de nom_commande ainsi que celui de sa page man.
which nom_commande
- affiche le chemin de nom_commande.
Pour obtenir une information sommaire sur une commande externe
--help nom_commande
Le shell crée un processus pour exécuter une commande externe. Parmi les commandes externes que l'on trouve dans un système, il y a les commandes unix (ex. ls, mkdir, vi, sleep) et les fichiers shell (scripts shell). La localisation du code d'une commande externe doit être connu du shell pour qu'il puisse exécuter cette commande. A cette fin, bash utilise la valeur de sa variable prédéfinie PATH.
type cd cd est une primitive du shell
type cp cp est /bin/cp
type sleep sleep est /bin/sleep
⇒ /bin/commande signifie donc que c'est une commande externe.
type ls ls est un alias vers « ls --color=auto »
whereis ls ls: /bin/ls /usr/share/man/man1/ls.1.gz
which ls /bin/ls # => ls est donc l'alias de la commande externe /bin/ls
Les commandes simples peuvent être des commandes internes ou des commandes externes.
cat, chgrp, chmod, chown, cp, date, dd, df, dmesg, echo, ed, export, false, kill, ln, login, ls, mkdir, mknod, more, mount, mv, ps, pwd, rm, rmdir, sed, setserial, sh, stty, su, sync, true, umount, uname.
Les commandes composées peuvent toutes être considérées comme des commandes internes, en tant qu'elles sont des structures de contrôle.
case ... esac ; if ... fi ; for ... done ; select ... done ; until ... done ; while ... done ; {...} ; ( ... ) ; ((...)) ; [ ... ] ; [[ ]]
Certains caractères spéciaux sont appelés “méta-caractères” ; soit parce qu'ils servent à effectuer des recherches sur les mots ; soient parce qu'ils servent dans les expressions rationnelles; soit encore parce qu'ils représentent symboliquement quelque chose, un fichier, la valeur d'une variable ; finalement parce que ces caractères représentes symboliquement quelque chose;
Voici un tableau qui regroupe les méta-caractères :
Communs à différents shell | ||
---|---|---|
stricts | ? ( pour un caractère ) |
|
* ( plusieurs caractères ) | ||
brackets | [ ] ( plage de caractère [12] ou union [1-3] ) |
En effet, une chaîne de caractères ordinaires est un motif.
Et un motif contenant un ou plusieurs “caractères géniriques” est appelé un “motif générique”.
Les caractères génériques servent à évoquer un ou plusieurs caractères ; mais aussi l'emplacement d'un et/ou plusieurs caractères.
Quant au globbing, cela concerne l'opération qui permet d'invoquer par un motif générique, une liste de noms de fichiers pouvant correspondre à ce motifs.
Un enchaînement de motifs génériques est nommée par extension, “une expression générique”.
Dans la terminologie de man bash, il s'agit bien des mêmes caractères recouvrant la même fonction. Bref, Un caractère générique est une sous-classe de ce qui y est appelé caractère spécial et renvoie à la fonction de globbing.
En définitive, dans la suite j'emploierai le terme “métacaractère” comme synonyme de globs simples et bracket.
Les termes regex ou regexp en sont les abréviations à partir du terme anglais “regular expressions”.
Voir : Regexp et grep
Voir : Regex et sed
Pour un rappel des principaux caractères des expressions rationnelles voir : INDEX
# Dans les accolades précédées de $ : ${ } on peut trouver les caractères : :- := : :: :+ :? @ * ## %% % # Ne pas confondre avec joker ou bracket vus ci-dessus
C'est le sujet chap. 7 : Bash : les caractères de transformation de parametres
Détails et exercices sur : métacaractères, ou globs, ou encore patterns
On sait que ls -a permet de lister tous les fichiers, le retour est alors un peu trop copieux
De même ls -a* est très prolixe.
On peut alors faire :
ls -d .*
⇒ On obtiendra alors tous les fichiers cachés.
Pour affiner la recherche on faire pour n'avoir que ceux dont le nom commence par un c :
ls -d .c*
Retour :
.cache .config
C'est là qu'il y a un petit piège !
.* représente un point (.) mais aussi deux points (..)
ls .* # et son équivalent : ls .?*
⇒ va afficher du répertoire courant (.) : tous les fichiers cachés (normaux) et tous les fichiers cachés de type-répertoire avec les noms des fichiers cachés contenus dans ces répertoires ;
mais aussi du répertoire parent (..) : tous les fichiers cachés normaux et les fichiers cachés de type-répertoire, avec les noms des fichiers cachés contenus dans ces répertoires !
ls .[!.]*
⇒ liste du répertoire courant : tous les fichiers cachés normaux et les fichiers cachés de type-répertoire, avec les fichiers cachés de ces répertoires.
ls -d .[!.]* # et son équivalent : ls -d .??*
⇒ liste du répertoire courant : tous les noms de fichiers normaux cachés et le nom de tous les fichiers cachés de type-répertoire (sans leurs contenus cette fois !)
méta-caractère Un caractère qui, non protégé, sépare les mots. Un de ceux-ci : | & ; ( ) < > espace tabulation
Un “mot” est quant à lui “une séquence de caractères considérée comme une unité élémentaire par le shell. On parle également de token (jeton)”.
Mais pourquoi évoquer les mêmes caractères sous des appellations différentes ?
Pourquoi trouve-t-on certains caractères dans la définition des méta-caratères ci-dessus, mais aussi dans la liste des opérateurs de contrôle ?
S'agit-il de la même chose?
Cette appellation méta-caractère que l'on trouve dans le man bash, renvoie à l'analyse et au traitement par le shell de la ligne de commande. L'ordre d'analyse est le suivant :
Chacun des caractères ci-dessus permet de découper la ligne de commande en mots à l'aide des blancs, non seulement avec “espace” et tabulation“, mais aussi avec ces autres séparateurs de mots : | (il ne s'agit pas “encore” du pipe) & ; , < , >
Ce qu'il faut comprendre, c'est que “espace et “tabulation” permettent de déterminer la commande (premier mot), des (ou de l'option) options (reconnue(s) par - placé avant elle(s), et les arguments.
Les autres signes ci-dessus, désignés de méta-caractères, sont des séparateurs de mots différents de “espace” et “tabulation” parce que, en plus de séparer les mots, ils indiquent le contexte d'exécution des commandes.
Ce qu'il faut comprendre c'est que les méta-caractères, outre “espace” et “tabulation”, font partie des caractères spéciaux de bash. Il s'agit avec cette définition d'une première évocation simplifiée indiquant que parmi tous les caractères spéciaux, ces “méta-caractères” se trouvent là présentés seuls | & ; ( ) < > pour indiquer que leurs significations dépendra de l'étape 2 ci-dessus, du contexte des commandes. Ce contexte dépend des commandes puis selon la composition de ces méta-caractères entre eux, et/ou la présence de commandes, de la mise en oeuvre des commandes internes, des opérateurs d'enchaînement de commandes, des opérateurs de redirection.
À l'usage, on regroupe ces “méta-caractères”, sous l'appellation de “mots réservés”. Il y a deux sortes de mots réservés : les opérateurs de contrôle et les opérateurs de redirection
|| && ; & ;; ( ) | <retour-chariot>
|| && ; <retour-chariot>
Le signe | ne fait pas référence ici au pipe qui sert dans les tubes. C'est un ” OU ” logique qui apparaît dans deux cas :
1) avec ;; dans le contexte de la commande “case” ;
case $variable-name in pattern1|pattern2|pattern3 # ^ ^ # ou ou command1 ... commandN *) esac
2) et dans le contexte d'utilisation des globs étendus et des expressions rationnelles
voir : bash-vii-globs-etendus-regex
Il signifie la aussi “ OU “
Par exemple :
ls ~/Test/!(*jpg|*bmp)
Deuxièmement, on retrouve la paire de parenthèse dans le contexte de la commande “function”.
name (){ commands return $TRUE } name
Ou encore dans les substitutions de commande $( ).
Enfin il apparaît une paire de parenthèses dans le cas des globs étendus (voir lien ci-dessus) ;
et dans les expressions rationnelle (voir : bash-vii-globs-etendus-regex
La double paire de parenthèse sert à faire des calculs (voir : page-man-bash-iv-symboles-dans-les-calculs-mathematiques.
À voir : enchainer-plusieurs-commandes
< > > | << >> <& >&
> >> < << >& |
Il s'agit bien du pipe cette fois, et étant une redirection un peu différente, on le trouve souvent explicité à part.
<&- <&-
Permettent la fermeture de l'entrée standard et de la sortie standard.
Tous les caractères spéciaux, c'est-à-dire les symboles auxquels le shell est sensible. Il s'agit de tous ceux qui ne servent pas à séparer les mots ou les commandes.
Comme nous le verrons dans cette série de wiki, il s'agit des caractères qui inhibent la reconnaissance des caractères spéciaux et des métacaractères (“glob” ou “patterns” et “bracket expression” ; des mots réservés des commandes composées ; des caractères qui transforment un caractère simple en caractère spécial (par exemple, le tiret devant une lettre, fait reconnaître cette lettre comme une option !) et enfin, des caractères symboliques qui représentent différentes sortes de fichiers, ou les variables d'environnement prédéfinies ou encore les paramètres prédéfinis.
Un script est la rédaction dans un fichier texte d'un ensemble de commandes et d'expressions régulières (caractères utilisés symboliquement) orientant les instructions données aux commandes.