Eclats de vers : Ordina 04 : Shell
1. Zsh
- 1.1. Base
- 1.2. Ligne de commande
- 1.3. Caractères magiques
- 1.4. Motifs
- 1.5. Fichiers
- 1.6. Processus
- 1.7. Redirections
- 1.8. Variables
- 1.9. Globalisation
- 1.10. Tableaux
- 1.11. Dictionnaires
- 1.12. Environnement
- 1.13. Scripts
- 1.14. Configuration
- 1.15. Fonctions
- 1.16. Conditions
- 1.17. StructuresDeControle
- 1.18. Abréviations
- 1.19. Édition de la ligne de commande
- 1.20. Complétion
- 1.21. Historique des commandes
- 1.22. Conventions
1.1. Base
Un shell est un programme qui intéragit avec l’utilisateur au moyen d'un interpréteur de commande. Il permet de dialoguer avec le système d'exploitation. Nous allons étudier zsh, un shell très complet.
man commande | Donne le manuel d'une commande |
man -k motclé | Donne la liste des commandes correspondant à un motclé |
run-help commande | Aide sur une commande |
apropos motclé | Donne la liste des commandes correspondant à un motclé |
type mot | Donne la nature du mot : brique du shell, alias, fonction, commande, etc |
rehash | Recharge le cache |
exit | Sort du shell courant |
1.1.1. Lecture et écriture
Affiche du texte | |
cat | Affiche le contenu d'un fichier |
1.1.2. Terminal
<ctrl s> | Stoppe le terminal |
<ctrl q> | Reprend le terminal |
setterm | Contrôle du comportement du terminal |
stty -a | Affiche les principales commandes de contrôle du terminal |
reset | Réinitialise le terminal |
clear | Nettoie le terminal |
1.1.3. Divers
: | Commande qui ne fait rien, mais qui est parfois exigée par la syntaxe |
1.2. Ligne de commande
Une ligne de commande est une ligne interprétable et donc exécutable par le shell. On exécute une ligne de commande au moyen de la touche « Return » :
/ligne_de_commande/ <Return>
Une ligne de commande basique se compose généralement d'un mot désignant la commande, éventuellement suivi par un ou plusieurs mots pouvant influencer le comportement de cette commandes. Ces derniers sont appelés arguments de la commande. On a donc schématiquement une des dispositions suivantes :
/commande/ /commande/ /argument/ /commande/ /argument_1/ /argument_2/ /.../ /argument_N/
Il existe bien entendu des lignes de commandes plus complexes : commandes composées de commandes simples, multilignes, représentant des structure de contrôle, etc.
1.2.1. Espaces
Les espaces ont une fonction essentielle : séparer les chaînes de caractères que le shell va considérer comme des mots. On a vu par exemple que dans une ligne de commande, les arguments sont des mots séparés par un espace.
Lorsqu'on souhaite signaler au shell qu'une chaîne de caractères contenant des espaces doit malgré tout être considérée comme un seul mot, on dispose de trois techniques.
La première méthode utilise le préfixe « \ » devant chaque espace. Exemple :
Chaîne\ de\ caractères\ vue\ comme\ un\ seul\ mot
La deuxième méthode entoure la chaîne de guillemets simples :
'Chaîne de caractères vue comme un seul mot'
La troisième méthode entoure la chaîne de guillemets doubles :
"Chaîne de caractères vue comme un seul mot"
1.2.2. Précommande
Une précommande modifie la façon dont le shell interprète la ligne. Comme son nom l'indique, on la place avant la commande :
/precommande/ /commande/ /argument(s)/
1.2.3. Commandes internes et externes
Une commande interne du shell est appelée builtin, par opposition aux commandes externes du système d'exploitation. Lorsqu'il y a un risque d'ambiguité, les précommandes suivantes permettent de préciser quel type de commande on souhaite exécuter :
builtin commandeinterne | Précise que l'on souhaite l'exécution d'une commande interne |
command commandeexterne | Précise que l'on souhaite l'exécution d'une commande externe |
1.3. Caractères magiques
Certains caractères ou groupes de caractères sont interprétés de façon particulière par le shell. On nomme caractères magiques de tels caractères. C'est le cas par exemple de :
$ * ? [ ] < > << >> [[ ]] Espaces, tabulations, retours ligne
1.3.1. Forme littérale
Il existe plusieurs méthodes pour transformer les caractères magiques en caractères ordinaires. La première méthode utilise le préfixe « \ »:
\/caractère_magique/
La deuxième méthode utilise des guillemets simples sur une chaîne contenant des caractères magiques :
'/chaine_avec_caractères_magiques/'
La troisième méthode utilise des guillemets doubles :
"/chaine_avec_caractères_magiques/"
ce qui a pour effet d'annuler l'effet spécial de certains caractères (dont les espaces) mais pas de tous. Par exemple, le « $ » est toujours actif.
1.4. Motifs
Le shell utilise un peu partout des motifs magiques. En voici les principaux :
* | N'importe quelle chaîne de caractères |
? | N'importe quel caractère |
[/groupeDeCaractère/] | N'importe quel caractère du groupe |
[^/groupeDeCaractère/] | N'importe quel caractère sauf ceux du groupe |
</M/-/N/> | N'importe quel nombre entier entre M et N |
(chaine-1/¦/chaine-2) | chaine-1 ou chaine-2 |
1.4.1. Variantes
Les accolades permettent de jongler avec les variantes d'un mot. Ainsi :
{/Chaine/,/Variante/}
est équivalent à :
/Chaine/ /Variante/
Plus généralement :
/abc/{/Chaine/,/Variante/}/xyz/
est équivalent à :
/abc//Chaine//xyz/ /abc//Variante//xyz/
Un exemple courant d'utilisation est de renommer un fichier vers un nom proche. Ainsi, pour modifier l'extension .txt en .sh, on fait :
mv /fichier/.{txt,sh}
qui sera étendu par le shell en :
mv /fichier/.txt /fichier/.sh
1.4.2. Plages
Les accolades permettent également de générer une plage de nombres entiers. On utilise alors la forme :
{/M/../N/}
1.5. Fichiers
1.5.1. Objets
Un fichier est un objet destiné à contenir des données.
Un répertoire est un objet destiné à contenir d'autres objets : fichiers, sous-répertoires, etc.
Un lien symbolique est un objet destiné à contenir une adresse permettant d'accéder à un autre objet : fichier, répertoire, etc. On dit que le lien symbolique référence l'objet auquel il permet d'accéder.
Un lien dur est un fichier synonyme d'un autre fichier : les deux noms référencent le même fichier.
1.5.1.1. Fichier standard ou régulier
On part des constatations suivantes :
- un répertoire peut être vu comme un fichier particulier contenant une liste de fichiers, sous-répertoires, liens, etc
- un lien symbolique peut être vu comme un fichier contenant une adresse vers un objet
On utilise donc par extension le terme de fichier pour désigner également des répertoires, liens symboliques, etc.
Lorsqu'on veut préciser qu'un fichier n'a rien de particulier, c'est-à-dire qu'il n'est ni un répertoire, ni un lien symbolique, etc, on parle de fichier standard ou de fichier régulier.
1.5.1.2. Arborescence
Une arborescence est constituée de répertoires emboîtés les uns dans les autres. Le répertoire racine contient tous les répertoires de niveau un. Chaque répertoire de niveau un contient à son tour des répertoires de niveau deux. Chaque répertoire de niveau deux contient des répertoires dits de niveau trois, etc.
1.5.1.3. Système de fichier
Un système de fichiers est grossièrement une table constituée de deux colonnes : la première colonne contient les noms de fichiers et la seconde contient l'adresse permettant d'accéder au contenu du fichier sur le disque :
fichier-1 | adresse-1 |
fichier-2 | adresse-2 |
… | … |
fichier-N | adresse-N |
1.5.1.3.1. Montage
Les système Unix permettent généralement de monter l'arborescence complète d'un système de fichier dans un répertoire d'un autre système de fichiers, ce qui fait qu'une arborescence peut contenir plusieurs systèmes de fichiers.
1.5.2. Symboles
Le répertoire racine est symbolisé par :
/
Le répertoire courant est désigné par un point :
.
Le répertoire parent est le répertoire contenant le répertoire courant. On le désigne par deux points consécutifs :
..
Le tilde désigne le répertoire personnel (souvent home//utilisateur) de l'utilisateur courant :
~
Le symbole :
~/utilisateur/
désigne le répertoire personnel d'un utilisateur donné.
Le zsh a également comme convention de désigner par :
~+
le répertoire actuel et par :
~-
le répertoire d'où l'on vient.
1.5.3. Navigation dans les répertoires
La commande cd permet d'accéder à un sous-répertoire Rép du répertoire courant :
cd /Rép/
Il est possible de se déplacer de plusieurs niveaux d'un coup. La commande :
cd /Rép_1///Rép_2/
accède au sous-répertoire Rép2 du sous-répertoire Rép1 du répertoire courant. On généralise cette commande par :
cd /Rép_1///Rép_2///...///Rép_N/
On parle pour :
/Rép_1///Rép_2///...///Rép_N/
de chemin relatif, car il dépend du répertoire courant. Il est également possible de désigner le chemin de répertoires en partant de la racine du système de fichier. Il suffit pour cela de faire précéder le chemin du symbole / désignant la racine :
cd //Rép_1///Rép_2///...///Rép_N/
On parle pour :
//Rép_1///Rép_2///...///Rép_N/
de chemin absolu, car il ne dépend pas du répertoire courant.
On se déplace vers le répertoire parent par :
cd ..
On se déplace vers le répertoire racine par :
cd /
On se déplace vers le répertoire d'où l'on vient par :
cd -
La commande :
pwd
affiche le répertoire courant.
1.5.4. Pile de répertoires
La pile de répertoires permet de conserver les répertoires fréquemment utilisés. Le répertoire courant sera toujours adapté au répertoire situé au sommet de la pile.
On ajoute un répertoire au sommet de la pile par :
pushd /répertoire/
Cette commande a donc également pour effet de se déplacer vers le répertoire donné.
On supprime le répertoire situé au sommet de la pile par :
popd
Cette commande a également pour effet de se déplacer vers le répertoire qui était situé juste sous le sommet de la pile et qui devient à présent le sommet.
On affiche le contenu de la pile par :
dirs -v
On se déplace au /N/<sup>ème</sup> répertoire en partant du sommet de la pile par :
pushd +/N/
On se déplace au /N/<sup>ème</sup> répertoire en partant du bas de la pile par :
pushd -/N/
Chaque répertoire de la pile est également accessible par :
cd ~/N/
où N est le numéro du répertoire donné par la sortie de « dirs -v »
1.5.5. Liste des fichiers
La commande :
ls
affiche le contenu du répertoire courant : fichiers, sous-répertoires, liens, etc. Par défaut, elle n'affiche pas les objets cachés, qui commencent par convention par un point dans les systèmes Unix. L'option -a permet d'afficher tous les objets, masqués ou non :
ls -a
On peut donner en argument le nom du répertoire dont on souhaite afficher le contenu :
ls /répertoire/
L'option -l affiche plus d'information :
ls -l
L'option -t trie par date de dernière modification :
ls -t
L'option -d permet d'afficher seulement les informations sur un répertoire, sans en explorer le contenu :
ls -d /répertoire/
On la combine souvent avec l'option -l :
ls -l -d /répertoire/
Les options pouvant se condenser devant un unique tiret, on a la forme équivalente :
ls -ld /répertoire/
1.5.6. Création de répertoire
La commande :
mkdir /répertoire/
crée un répertoire. L'option -p permet de créer plusieurs niveaux de répertoires d'un coup :
mkdir -p /Rép_1///Rép_2///...///Rép_N/
1.5.7. Copie
La commande cp permet de copie un fichier source vers un fichier ou répertoire destination :
cp /source/ /destination/
Cet exemple copie le contenu d'un fichier dans un autre :
cp /fichier_1/ /fichier_2/
Cet exemple copie un fichier dans un répertoire donné :
cp /fichier/ /répertoire/
Cet exemple copie un fichier provenant d'un autre répertoire dans le répertoire courant :
cp /chemin///fichier/ .
Cet exemple copie un fichier dans le répertoire parent :
cp /fichier/ ..
Par défaut, la commande cp n'agit que sur des fichiers. L'option -R lui demande d'agir récursivement sur les répertoires, les sous-répertoires, et ainsi de suite :
cp -R /répertoire-source/ /répertoire-destination/
1.5.8. Renommer ou déplacer
La commande mv permet de renommer ou déplacer un fichier. Sa syntaxe est similaire à celle de cp :
mv /source/ /destination/
Cet exemple renomme un fichier :
mv /fichier_1/ /fichier_2/
Cet exemple déplace un fichier dans un répertoire donné :
mv /fichier/ /répertoire/
Cet exemple déplace un fichier provenant d'un autre répertoire dans le répertoire courant :
mv /chemin///fichier/ .
Cet exemple déplace un fichier dans le répertoire parent :
mv /fichier/ ..
1.5.9. Suppression
La commande rm efface des fichiers :
rm /fichier(s)/
L'option -r lui demande d'agir récursivement sur des répertoires :
rm -r /répertoire(s)/
L'option -f lui demande de ne pas demander confirmation :
rm -f /fichier(s)/ rm -rf /répertoire(s)/
Pour être plus précis, la commande rm n'efface pas les contenus des fichiers sur le disque, mais uniquement les entrée correspondantes dans la table du système de fichier.
1.5.10. Liens
1.5.10.1. Symboliques
La commande ln permet de créer des liens. L'option -s crée un lien symbolique :
ln -s /cible/ /lien_symbolique/
La cible peut être un fichier, un répertoire, un autre lien, etc. Les accés au lien seront considérés comme des accès à la cible qu'il référence. Ainsi, si on crée un lien symbolique vers un fichier :
ln -s /fichier/ /lien_fichier/
et qu'on demande à un éditeur de texte d'ouvrir le lien, ce sera bien le contenu du fichier cible qui apparaîtra. Si on crée un lien symbolique vers un répertoire en donnant un chemin absolu ou relatif pour cible :
ln -s /répertoire/ /lien_répertoire/
la commande :
cd /lien_répertoire/
sera équivalente à :
cd /répertoire/
1.5.10.2. Durs
La commande ln sans option -s crée un lien dur :
ln /cible/ /lien_dur/
1.5.10.3. Différences
Un lien symbolique contient une référence à un nom de fichier, ce dernier permettant de retrouver dans la table du système de fichier auquel il appartient l'adresse du contenu sur le disque. On a donc le schéma :
Lien_symbolique ——> Nom_du_fichier ——> Contenu
Si on supprime le lien symbolique :
rm Lien_symbolique
le fichier sera toujours accessible :
Nom_du_fichier ——> Contenu
Par contre, si on supprime le fichier ciblé par le lien :
rm Nom_du_fichier
le lien référencera une entrée dans la table du système de fichier qui n'existe plus :
Lien_symbolique ——> ??? ——> Contenu
et le contenu du fichier sera introuvable.
Un lien dur est un synonyme ajoutant une entrée dans la table du système de fichier :
… | … |
Nomdufichier | Adresseducontenu |
Liendur | Adressedu-contenu |
… | … |
On a donc le schéma :
Nom_du_fichier ——> Contenu <—— Lien_dur
Si on supprime le lien dur :
rm Lien_dur
le fichier sera toujours accessible :
Nom_du_fichier ——> Contenu
Il en va de même si on supprime le fichier ciblé par le lien :
rm Nom_du_fichier
car le contenu sera alors accessible via le lien :
Contenu ⟻ Lien_dur
Le lien dur est donc symétrique pour la suppression, tandis que le lien symbolique est asymétrique. Comme autres différences, notons qu'un lien symbolique peut référencer un fichier situé dans un autre système de fichiers, tandis que les liens durs sont confinés à l'intérieur d'un même système de fichier.
1.5.11. Propriétaire et groupe
Sous les systèmes UNIX, un fichier appartient à un propriétaire et à un groupe. On peut modifier ces paramètres via la commande :
chown /propriétaire/:/groupe/ /fichier/
Attention toutefois, une fois que l'on n'est plus propriétaire du fichier, il n'y a plus de retour en arrière possible : seul le propriétaire d'un fichier et le super-utilisateur root peuvent modifier propriétaire et groupe d'un fichier.
1.5.12. Permissions
Les principales permissions attachées à un fichier sont :
- r : Droit de lecture
- w : Droit d'écriture (de modification)
- x : Droit d'exécution
Ces permissions peuvent être données ou retirées :
- u : au propriétaire
- g : aux membres du groupe
- o : aux autres
Les permissions s'ajoutent au moyen de la commande :
chmod /qui/+/quoi/ /fichier/
ou se retirent au moyen de la commande :
chmod /qui/-/quoi/ /fichier/
où :
- qui = u, g ou o
- quoi = r, w ou x
Ainsi, la commande :
chmod g+w /fichier/
donne les droits d'écriture aux membres du groupes.
1.5.13. Attributs
Les attributs permettent de configurer finement certains fichiers Ils se modifient avec la commande :
chattr
qui utilise une syntexe +attribut/-attribut analogue à chmod.
1.5.14. Montage
La commande mount permet de monter un système de fichiers dans le répertoire d'un autre. Ce dernier répertoire est appelé point de montage :
mount /systèmeDeFichiers/ /pointDeMontage/
Les systèmes de fichiers sont généralement accessible par des fichiers magiques situés dans le répertoire /dev :
mount /dev//systèmeDeFichiers/ /pointDeMontage/
Un fichier image est un fichier contenant un système de fichiers. L'option -o loop permet de monter un fichier image :
mount -o loop /fichierImage/ /pointDeMontage/
Que faire si l’on souhaite manipuler plusieurs images en même temps ? On utilise losetup :
losetup -f
qui affiche le premier périphérique de boucle libre :
/dev/loop0
On lie ensuite ce résultat au fichier image par :
losetup /dev/loop0 /fichierImage/
Il ne reste plus qu'à monter ce périphérique :
mount /dev/loop0 /pointDeMontage/
Si on souhaite recommencer avec une autre image :
losetup -f
qui affiche le premier périphérique de boucle libre :
/dev/loop1
On lie ensuite ce résultat au fichier image par :
losetup /dev/loop1 /autreFichierImage/
Il ne reste plus qu'à monter ce périphérique :
mount /dev/loop1 /pointDeMontage/
1.5.15. Autres commandes
basename fichier | Nom du fichier sans le répertoire |
dirname fichier | Nom du répertoire sans le fichier |
readlink lien | Cible du lien |
readlink -f lien | Cible récursive du lien |
1.6. Processus
Une commande attachée au terminal s'appelle un job.
Lorsque le shell attend la fin de l'exécution d'un job avant d'accepter d'autres commandes, on dit que le job est en avant-plan. Il ne peut donc y avoir au maximum qu'un seul job en avant-plan à un instant donné.
Lorsque le shell exécute un job en parallèle tout en acceptant d'autres commandes, on dit que le job est en arrière-plan. Il peut donc y avoir plusieurs jobs en arrière-plan à un instant donné.
1.6.1. Contrôle du terminal
<ctrl d> | Signale la fin de fichier ou sort du shell courant |
<ctrl s> | Suspend la sortie du terminal |
<ctrl q> | Reprend la sortie du terminal |
1.6.2. Contrôle des jobs en avant-plan
job | Lance un job en avant-plan |
<ctrl c> | Annule le job |
<ctrl z> | Suspend le job |
1.6.3. Contrôle des jobs en arrière-plan
job & | Lance un job en arrière-plan |
job1 & job2 & ….. & jobN & | Lance plusieurs jobs en parallèle |
jobs | Donne la liste des jobs |
wait %/nom/ | Attend la fin du job dont le nom contient nom |
kill %/nom/ | Termine le job dont le nom contient nom |
1.6.4. Contrôle hybride
job1 & job2 | Lance job1 en arrière-plan et job2 en avant-plan |
1.6.4.1. Passage entre avant-plan et arrière-plan
La commande fg permet de faire passer en avant-plan un job lancé en arrière-plan ou suspendu par <ctrl z> :
fg %/nom/
La commande bg permet de faire passer en arrière-plan un job lancé en avant-plan et suspendu par <ctrl z> :
bg %/nom/
1.6.5. Détachement
job &! | Lance un job et le détache du shell Il ne sera pas terminé lors de la fermeture du shell |
disown %/nom/ | Détache du shell le job dont le nom contient nom |
1.6.6. Exécution conditionnelle
La structure :
/commande1/ && /commande2/
exécute commande2 uniquement si commande1 réussit.
La structure :
/commande1/ || /commande2/
exécute commande2 uniquement si commande1 échoue.
La structure :
/commande1/ && /commande2/ || /commande3/
exécute commande2 si commande1 réussit. Si commande1 ou commande2 échoue, commande3 sera exécutée.
Par exemple, la commande :
wait %/nom/ && /commande/
attend la fin du job dont le nom contient nom et exécute commande ensuite.
1.7. Redirections
Chaque commande executée dans un shell possède trois canaux par défaut où transitent les données :
- l'entrée standard, où la commande lit ses données
- la sortie standard, où la commande écrit ses données ordinaires
- l'erreur standard, où la commande écrit ses messages d'erreurs
Par défaut, entrée, sortie et erreur standard se font sur le terminal, mais on peut demander au shell de rediriger ces canaux vers un fichier.
1.7.1. Entrée
La ligne suivante demande à la commande de lire son entrée standard dans un fichier :
/commande/ < /fichier/
On dit alors que l'entrée standard est redirigée vers le fichier.
1.7.1.1. Herescript
Les lignes suivantes :
/commande/ << /signalFin/ /blabla/ /signalFin/
demandent à la commande de lire ses données d'entrée standard dans la où les lignes blabla jusqu'à l'apparition de signalFin. La variante suivante ignore les tabulations en début de ligne :
commande <<- signalFin
/blabla/
signalFin
1.7.1.2. Herestring
La ligne suivante :
commande <<< "chaîne"</div>
demande à la commande de lire ses données d'entrée standard dans une chaîne de caractères. La chaîne de caractères peut occuper plusieurs lignes :
commande <<< "blabla
/blabla/ /blabla/"
1.7.2. Sortie
On peut demander à une commande d'écrire ses données de sortie standard dans un fichier :
/commande/ > /fichier/
Le fichier est écrasé si il existe déjà. On dit que la sortie standard est redirigée vers le fichier.
1.7.2.1. Ajout
On peut demander à une commande d'écrire ses données de sortie standard en ajout à la fin d'un fichier :
/commande/ >> /fichier/
1.7.2.2. Écraser
Suivant les options, il est possible que zsh refuse d'écraser un fichier qui existe déjà. On peut le forcer à le faire par :
/commande/ >! /fichier/
La ligne suivante produit le même résultat :
/commande/ >| /fichier/
1.7.2.3. Créer
Si zsh refuse d'écrire en ajout dans un fichier qu'il doit créer, on peut le forcer à le faire par :
/commande/ >>! /fichier/
La ligne suivante produit le même résultat :
/commande/ >>| /fichier/
1.7.3. Sortie et erreur
On peut demander à une commande d'écrire ses données de sortie et d'erreur standard dans un fichier :
/commande/ >& /fichier/
La ligne suivante produit le même résultat :
/commande/ &> /fichier/
On peut demander à une commande d'écrire ses données de sortie et d'erreur standard en ajout à la fin d'un fichier :
/commande/ >>& /fichier/
La ligne suivante produit le même résultat :
/commande/ &>> /fichier/
1.7.3.1. Écraser
Suivant les options, il est possible que zsh refuse d'écraser un fichier qui existe déjà. On peut le forcer à le faire par :
/commande/ >&! /fichier/
1.7.3.2. Créer
Si zsh refuse d'écrire en ajout dans un fichier qu'il doit créer, on peut le forcer à le faire par :
/commande/ >>&! /fichier/
1.7.4. Tube
La sortie standard d'une commande peut être redirigée vers l'entrée standard d'une autre commande, le flux de données passant de la première à la seconde :
/commande-1/ | /commande-2/
Plusieurs commandes peuvent être chaînées ainsi :
/commande-1/ | /commande-2/ | /.../ | /commande-N/
Les données passent donc d'une commande à l'autre, un peu comme l'eau circule dans une canalisation. Cette analogie explique la dénomination anglaise de « pipe », qui peut se traduire par « tube ».
1.7.4.1. Sortie et erreur
Le flux agrégé de sortie et d'erreur standard d'une commande peut être redirigée vers l'entrée standard d'une autre commande :
/commande-1/ |& /commande-2/
Plusieurs commandes peuvent être chaînées ainsi :
/commande-1/ |& /commande-2/ |& /.../ |& /commande-N/
1.7.4.2. Tube nommé
Un tube nommé se crée par :
mknod /tube/ p
ou :
mkfifo /tube/
La suite de commandes :
/commande-1/ > /tube/ & /commande-2/ < /tube/
est alors équivalente à :
/commande-1/ | /commande-2/
Remarquons que la première commande ne peut pas s'exécuter tant que la seconde ne va pas lire dans le tube nommé.
1.7.5. Arguments
1.7.5.1. Sortie d'une commande
Lorsqu'une commande commande-1 accepte des arguments, il est possible de lui indiquer que ceux-ci proviennent de la sortie d'une autre commande. Supposons que la sortie de commande-2 soit :
/arg1 arg2 arg3 .../
La ligne de commande :
/commande-1/ $(/commande-2/)
est équivalente à :
/commande-1/ /arg1 arg2 arg3 .../
1.7.5.2. Fichier contenant des arguments
Lorsqu'une commande commande-1 accepte des arguments, il est possible de lui indiquer que ceux-ci sont contenus dans un fichier. Supposons que fichier contienne :
/arg1 arg2 arg3 .../
La ligne de commande :
/commande-1/ $(</fichier/)
est équivalente à :
/commande-1/ /arg1 arg2 arg3 .../
1.7.5.3. Fichier virtuel en entrée
Lorsqu'une commande commande-1 accepte un fichier en argument, il est possible de remplacer le contenu de ce fichier par la sortie standard d'une commande <span class="rouge">commande-2/. On utilise alors la notation :
/commande-1/ <(/commande-2/)
Lorsqu'une commande accepte plusieurs fichiers en arguments, on a la notation :
/commande-1/ <(/commande-2/) /.../ <(/commande-N/)
1.7.5.3.1. Fichier temporaire
La forme :
/commande-1/ =(/commande-2/)
est équivalente à :
/commande-1/ <(/commande-2/)
mais utilise un fichier temporaire au lieu d'un tube nommé, ce qui est plus lent mais permet plus de possibilités en lecture.
1.7.5.4. Processus en sortie
Il est possible d’envoyer la sortie d’une commande commande vers l’entrée standard d’un processus commande-2. On utilise alors la notation :
/commande/ > >(/processus/)
Lorsque la commande écrit dans le fichier qu’elle reçoit en argument, on a la forme plus simple :
/commande/ >(/processus/)
1.7.6. Codes et canaux
Les canaux d'entrée et de sortie par défaut ont des codes :
- 0 : entrée standard
- 1 : sortie standard
- 2 : erreur standard
Les autres canaux (de 3 à 9) sont des canaux auxiliaires.
1.7.6.1. Redirection d'un canal
Il est possible de se servir de ces codes pour rediriger un de ces canaux vers un fichier :
/commande/ /canal/> /fichier/
Ainsi, la ligne :
/commande/ 1> /fichier/
redirige l'entrée standard vers le fichier. Elle est donc équivalente à :
/commande/ > /fichier/
La ligne :
/commande/ 2> /fichier/
redirige l'erreur standard vers le fichier.
1.7.6.2. Redirection d'un canal vers un autre
Il est également possible de rediriger un de ces canaux vers un autre au moyen de la syntaxe :
/canal-1/>&/canal-2/
pour un canal de sortie ou :
/canal-1/<&/canal-2/
pour un canal d’entrée. Ainsi, la ligne :
/commande/ > /fichier/ 2>&1
redirige la sortie vers le fichier, puis l'erreur vers la sortie. Les deux flux sont donc agrégés, et la commande est équivalente à :
/commande/ >& /fichier/
La ligne :
/commande-1/ 2>&1 | /commande-2/
agrège sortie et erreur avant de les envoyer dans le tube. Elle est donc équivalente à :
/commande-1/ |& /commande-2/
1.7.6.2.1. Par défaut
La notation :
>&/canal/
est un raccourci pour :
1>&/canal/
1.7.6.3. Fermeture d'un canal
On ferme un canal de sortie par l'instruction :
/canal/>&-
On ferme un canal d’entrée par l'instruction :
/canal/<&-
1.7.6.4. Exec
La commande exec permet de rediriger un canal jusqu'à instruction contraire. Par exemple, l'instruction suivante conserve l'ancienne sortie dans le canal auxiliaire 3 :
exec 3>&1
On peut à présent rediriger la sortie vers un fichier :
exec >>| /fichier/
On peut alors exécuter plusieurs commandes, leurs sorties seront redirigées vers le fichier. La commande :
exec 1>&3
revient à la sortie antérieure et l'instruction :
exec 3>&-
ferme le canal auxiliaire.
1.7.7. Modification
La commande suivante :
/commande/ <> /fichier/
ouvre le fichier en lecture et en écriture tout en redirigeant l'entrée vers le fichier. Lorsqu'on la combine avec une redirection de la sortie standard vers l'entrée, la commande va lire et écrire ses données dans le même fichier :
/commande/ <> /fichier/ 1>&0
1.7.8. Multios
Un multios est une redirection multiple.
On peut rediriger l'entrée vers plusieurs fichiers :
/commande/ < /fichier-1/ < /fichier-2/
Les fichiers sont lus dans l'ordre de leur apparition.
On peut rediriger la sortie vers plusieurs fichiers :
/commande/ > /fichier-1/ > /fichier-2/
La sortie est alors écrite dans chaque fichier vers lequel on redirige.
On peut combiner entrée et pipe. La ligne suivante demande à la seconde commande de lire ses données dans la sortie de la première commande, puis dans le fichier :
/commande-1/ | /commande-2/ < /fichier/
On peut combiner sortie et pipe. La ligne suivante demande à la première commande d'écrire ses données dans le fichier et de les envoyer à l'entrée de la seconde commande :
/commande-1/ > /fichier/ | /commande-2/
1.7.9. Lecture et écriture
1.7.9.1. Cat
Cette section décrit quelques commandes de base permettant de lire et d'écrire.
La commande « cat » lit du texte dans un fichier ou plusieurs fichiers passés en argument :
cat /fichier(s)-entrée/
et l'affiche à la sortie standard.
Si aucun argument n'est donné, le texte est lu à l'entrée standard et affiché à la sortie standard. Par exemple, pour insérer du texte dans un fichier, on peut utiliser la commande :
cat > /fichier-sortie/
Le texte est ensuite lu via l'entrée standard. On signale la fin de l'entrée en utilisant le caractère de fin de fichier « ctrl d ».
1.7.9.2. Print
La commande « print » affiche à l'entrée standard une simple chaîne de caractère ou plus généralement une expression interprétable par le shell :
print "/chaîne/" print /expression/
1.7.9.2.1. Lignes
Pour afficher du texte à raison d'un mot par ligne on utilise la variante :
print -l /expression/
1.7.9.2.2. Colonnes
Pour afficher du texte disposé en colonnes on utilise la variante :
print -c /expression/
1.7.9.3. Echo
La commande « echo » est similaire à « print » :
echo /expression/
1.7.9.4. Tee
La commande tee recopie son entrée standard sur sa sortie standard et dans un fichier. Cette commande est au tube ce que le « T » est au réseau de canalisations. Par exemple, dans cette structure :
/commande-1/ | tee /fichier/ | /commande-2/
la sortie de commande-1 est envoyée vers tee. Tee la recopie dans le fichier et la passe à commande-2. On aurait pu obtenir le même résultat avec :
/commande-1/ > /fichier/ | /commande-2/
1.7.9.4.1. Plusieurs fichiers
On peut passer autant de fichiers que l'on veut en argument à tee : celui-ci va alors recopier l'entrée standard dans tous les fichiers donnés avant de l'envoyer vers la sortie standard :
/commande-1/ | tee /fichier-1/ /.../ /fichier-N/ | /commande-2/
1.8. Variables
Une variable est un objet contenant une valeur.
1.8.1. Déclaration
On peut déclarer une variable par :
typeset /variable/
L'instruction unset permet de donner un statut indéfini à une variable :
unset /variable/
1.8.2. Valeur
L'instruction :
/variable/=/valeur/
définit ou modifie la valeur contenue dans une variable. L'accès au contenu de cette variable se fait via la syntaxe :
$/variable/
Il peut être souhaitable de délimiter clairement le nom d'une variable, surtout si celle-ci est entourée de texte. On utilise alors des accolades :
${/variable/}
1.8.3. Guillemets
Supposons que :
/variable/=/contenu/
On souhaite que l'expression :
/abc/ $/variable/ /xyz/
soit considérée comme un seul mot malgré les espaces. On est alors tenté d'utiliser les guillemets simples :
print '/abc/ $/variable/ /xyz/'
mais il faut savoir que cette méthode annule l'effet de tous les caractères magiques et donc des « $ ». La commande précédente affichera donc littéralement :
/abc/ $/variable/ /xyz/
Si on souhaite afficher le contenu de la variable, on utilisera les guillemets doubles. La commande : :
print "/abc/ $/variable/ /xyz/"
remplacera la variable par son contenu avant d'afficher :
/abc/ /contenu/ /xyz/
1.8.4. Éclatement en plusieurs mots
Une variable contenant des espaces, du type :
/variable/="/abc/ /def/ /.../ /uvw/"
est considérée comme un seul mot à cause des guillemets doubles, d'ailleurs nécessaires à la définition. On peut cependant demander au shell de considérer le contenu de la variable comme une liste de mots. On utilise alors la syntaxe :
${=/variable/}
Lorsque le séparateur n'est pas un espace, on peut le signaler par :
${(s//séparateur//)/variable/}
1.8.5. Lecture et écriture
read variable | Lit une variable sur l'entrée standard |
print $/variable/ | Affiche le contenu d'une variable sur la sortie standard |
1.8.6. Redirections
1.8.6.1. Sortie d'une commande
Il est possible de placer la sortie d'une commande dans une variable via la syntaxe :
/variable/=$(/commande/)
ou la forme alternative :
/variable/=`/commande/`
1.8.6.2. Contenu d'un fichier
Il est possible de placer le contenu d'un fichier dans une variable via la syntaxe :
/variable/=$(< /fichier/)
Cette commande est équivalente à :
/variable/=$(cat /fichier/)
mais en plus rapide.
1.8.7. Référence
On dit qu'une variable en référence une autre lorsqu'elle contient le nom d'une autre variable. La syntaxe :
${(P)/variable/}
s'évalue au contenu de la variable que contient variable. Pour y voir plus clair, supposons que :
/variable_cible/=/contenu/ /variable_référence/=/variable_cible/
La commande :
print $/variable_référence/
affiche le texte :
/variable_cible/
tandis que :
print ${(P)/variable/}
affiche le texte :
/contenu/
1.8.8. Évaluation
Par défaut, le shell n'interprète qu'une seule fois les motifs magiques d'une ligne de commande. Donc, si :
/variable/=/contenu/
La syntaxe :
$/variable/
sera simplement transformée en :
/contenu/
sans étape suplémentaire, et ce, même si le contenu de la variable contient des motifs réinterprétables. Il est cependant possible de demander au shell de réinterpréter le contenu de la variable. Cela se fait au moyen de la syntaxe :
${(e)/variable/}
Par exemple, si :
/variable_cible/=/contenu/ /variable/='$/variable_cible/'
la commande :
print $/variable/
affichera :
$/variable_cible/
tandis que :
print ${(e)/variable/}
affichera :
/contenu/
1.8.9. Expressions mathématiques
variable/=$[ /expression ] | La variable contient le résultat d'une expression mathématique |
variable/=$(( /expression )) |
1.8.10. Base
La commande :
print $(( [#/base/] /variable/ ))
exprime la valeur numérique contenue dans variable dans la base base.
1.8.11. Substitutions
Une substitution remplace la première occurence d'un motif par une chaîne donnée.
Une substitution globale remplace toutes les occurences d'un motif par une chaîne donnée.
${variable///avant///après} | La première occurence d'avant est remplacée par après |
${variable////avant///après} | Toutes les occurences d'avant sont remplacées par après |
${(I:/N/:)/variable///avant///après/} | Comme ${…/…/…} mais remplace la /N/<sup>ième</sup> correspondance |
${(I:/N/:)/variable////avant///après/} | Comme ${…//…/…} mais remplace à partir de la /N/<sup>ième</sup> correspondance |
${(S)/variable///avant///après/} | Comme ${…/…/…} mais remplace la correspondance la plus courte possible au lieu de la plus longue |
${(S)/variable////avant///après/} | Comme ${…//…/…} mais remplace les correspondances les plus courtes possible |
1.8.12. Suppressions
${variable/#/motif} | Enlève la plus petite correspondance au début |
${variable/##/motif} | Enlève la plus grande correspondance au début |
${variable/%/motif} | Enlève la plus petite correspondance à la fin |
${variable/%%/motif} | Enlève la plus grande correspondance à la fin |
On peut utiliser des fanions afin de demander d'afficher la partie supprimée ou la partie restante :
${(M)/variable/#/motif/} | Montre la partie enlevée |
${(M)/variable/##/motif/} | |
${(M)/variable/%/motif/} | |
${(M)/variable/%%/motif/} | |
${(R)/variable/#/motif/} | Montre la partie restante |
${(R)/variable/##/motif/} | |
${(R)/variable/%/motif/} | |
${(R)/variable/%%/motif/} |
La forme en (R) est en général inutile, puisqu'elle correspond au cas par défaut, mais peut être utile dans certains cas.
1.8.13. Valeur alternative
Certaines expressions permettent de spécifier une valeur alternative si la variable est vide ou non définie.
1.8.13.1. Variable indéfinie
${variable-valeur} | Valeur contenue dans la variable ou valeur si la variable n'est pas définie |
${variable/=/valeur} | Comme ${…-…} mais assigne la valeur à la variable |
${variable?} | Provoque une erreur si la variable n'est pas définie |
${variable?"message"} | Comme ${…?} mais avec un message d'erreur personnalisé |
${variable/+/valeur} | Donne valeur si la variable est définie |
1.8.13.2. Variable vide ou indéfinie
${variable:-valeur} | Valeur contenue dans la variable ou valeur si la variable est vide ou n'est pas définie |
${variable:=/valeur/} | Comme ${…:-…} mais assigne la valeur à la variable |
${variable:?} | Provoque une erreur si la variable est vide ou n'est pas définie |
${variable:?"message"} | Comme ${…:?} mais avec un message d'erreur personnalisé |
${variable:+/valeur/} | Donne valeur si la variable n'est pas vide |
1.8.14. Casse
${(L)/variable/} | Tous les caractères en minuscules |
${(U)/variable/} | Tous les caractères en majuscules |
${(C)/variable/} | La première lettre de chaque mot en majuscules, le reste en minuscules |
1.8.15. Forme littérale
Il est possible d'annuler l'effet magique de cartains caractères contenus dans une variable.
${(q)/variable/} | Méthode \caractère |
${(qq)/variable/} | Méthode guillemets simples : '…' |
${(qqq)/variable/} | Méthode guillemets doubles : "…" |
${(Q)/variable/} | Rétablit l'effet magique |
1.9. Globalisation
La globalisation (ou globbing en anglais) est une expression permettant de générer une liste de noms de fichiers correspondant à un motif donné. Par exemple, le caractère joker « * » génère la liste de tous les fichiers du répertoire courant. On peut afficher cette liste au moyen de la commande « print » :
print *
Les fichiers sont entendus au sens large : répertoires, liens, etc sont également considérés comme des fichiers. Voici les motifs les plus courants :
* | N'importe quelle chaîne de caractères | |
? | N'importe quel caractère | |
[/groupeDeCaractère/] | N'importe quel caractère du groupe | |
</M/-/N/> | N'importe quel nombre entier entre M et N | |
(chaine-1 | chaine-2) | chaine-1 ou chaine-2 |
1.9.1. Récursif
** | Comme * mais récursif dans les répertoires |
*/ | Tous les fichiers du répertoire courant et de ses sous-répertoires |
*/*/chaine/ | Tous les fichiers contenant chaine dans les sous-répertoires du répertoire courant |
* | Comme ** mais suit les liens symboliques |
1.9.2. Étendus
Si on active l'option :
setopt extendedglob
on dispose en plus des motifs de globbing suivant :
^*/chaine/* | Tous les fichiers sauf ceux contenant chaine |
globe-1/~/globe-2 | Les fichiers correspondant au globbing globe-1 mais pas à globe-2 |
(chaine)# | Un nombre quelconque de fois la chaine (de zéro à l'infini) |
(chaine)## | Au moins une fois la chaine |
1.9.3. Qualificateurs
/globe/([/N/]) | /N/<sup>ième</sup> fichier généré |
globe/([/M,/N/]) | Du /M/<sup>iène</sup>au /N/<sup>ième</sup> fichier généré |
1.9.3.1. Fichiers standard
/globe/(.) | Tous les fichiers réguliers correspondant au globbing globe |
/globe/(D) | Tous les fichiers réguliers, y compris les fichiers cachés, correspondant au globbing |
1.9.3.2. Répertoire
globe/() | Répertoires |
/globe/(F) | Répertoires non vides |
/globe/(/F) | Répertoires vides |
1.9.3.3. Liens
/globe/(@) | Liens symboliques |
/globe/(-.) | Fichiers ou liens vers des fichiers |
globe/(-) | Répertoires ou liens vers des répertoires |
/globe/(@-.) | Liens vers des fichiers standard |
globe/(@-) | Liens vers des répertoires |
/globe/(-@) | Liens cassés |
1.9.3.4. Propriétaire
/globe/(U) | Fichiers dont on est propriétaire |
/globe/(G) | Fichiers dont on le groupe est le même que le groupe par défaut du propriétaire |
globe/(u:/propriétaire:) | Fichiers dont le propriétaire est donné |
globe/(g:/groupe:) | Fichiers dont le groupe est donné |
1.9.3.5. Permissions
globe/(f:/permissions:) | Fichiers respectant la liste de permissions donnée sous la forme u+wx,g+w,o-w |
/globe/(r) | Fichiers lisibles par le propriétaire |
/globe/(w) | Fichiers modifiables par le propriétaire |
/globe/(x) | Fichiers exécutables par le propriétaire, répertoires inclus |
/globe/(R) | Fichiers lisibles par tous |
/globe/(W) | Fichiers modifiables par tous |
/globe/(X) | Fichiers exécutables par tous |
/globe/(*) | Fichiers exécutables |
1.9.3.6. Date de modification
globe/(m-/N) | Fichiers modifiés il y a au plus N jours |
globe/(ms-/N) | Fichiers modifiés il y a au plus N secondes |
globe/(mm-/N) | Fichiers modifiés il y a au plus N minutes |
globe/(mh-/N) | Fichiers modifiés il y a au plus N heures |
globe/(mw-/N) | Fichiers modifiés il y a au plus N semaines |
globe/(mM-/N) | Fichiers modifiés il y a au plus N mois |
1.9.3.7. Taille
globe/(Lk-/N) | Fichiers occupant au plus N KB |
globe/(Lk+/N) | Fichiers occupant au moins N KB |
globe/(Lm-/N) | Fichiers occupant au plus N MB |
globe/(Lk+/N) | Fichiers occupant au moins N MB |
1.9.3.8. Tri
/globe/(n) | Trie aussi suivant les nombres |
(o/…/) | Tri |
(O/…/) | Tri inversé |
/globe/(on) | Tri suivant le nom |
/globe/(On) | Tri inverse suivant le nom |
/globe/(oL) | Tri suivant la taille |
/globe/(om) | Tri suivant la date de modification |
/globe/(od) | Tri suivant la profondeur dans les sous-répertoires |
/globe/(om[/N/]) | /N/<sup>ième</sup> fichier le plus récemment modifié |
/globe/(oL[/N/]) | /N/<sup>ième</sup> fichier au classement par taille |
1.9.3.9. Opérations
Enchaîner plusieurs qualificateurs produit un « et » logique implicite. Les séparer par une virgule produit un « ou » logique. Le « non » logique est représenté par un « ^ ».
/globe/(.w) | Fichiers standard modifiables |
/globe/(.,w) | Fichiers standard ou modifiables |
/globe/(^.) | Fichiers sauf les fichiers standard |
/globe/(.*) | Fichiers standard sauf les exécutables |
1.9.3.10. Indices
/globe/([/N/]) | /N/<sup>ième</sup> élément de la liste générée par le globbing |
globe/([/M,/N/]) | Du /M/<sup>ième</sup> au /N/<sup>ième</sup> élément de la liste générée par le globbing |
1.9.3.11. Code
La syntaxe :
/globe/(e:'/code/')
exécute le code pour chaque fichier de la liste générée par le globbing. Si la commande réussit, le fichier est affiché. Le fichier en cours de traitement est stocké dans la variable :
$REPLY
Le tableau :
$reply
permet de remplacer le fichier en cours de traitement par une liste de fichiers.
1.9.4. Modificateurs
(qualificateur(s):/modificateur(s)/) | Ordre de la syntaxe |
/chemin///fichier/(:t) | Affiche les noms de fichiers sans le chemin |
/globe/(:t) | |
/chemin///fichier/(:h) | Affiche seulement le chemin |
/globe/(:h) | |
fichier./extension/(:r) | Affiche les noms de fichier sans extension |
/globe/(:r) | |
fichier./extension/(:e) | Affiche seulement les extensions |
/globe/(:e) | |
/globe/(:u) | Affiche le résultat du globbing en majuscules |
/globe/(:l) | Affiche le résultat du globbing en minuscules |
=/nom/ | Remplace le nom par le chemin complet du fichier si possible |
1.9.4.1. Substitution
globe/(:s//avant///après/) | La première occurence d'avant est remplacée par après dans le résultat du globbing globe |
globe/(:gs//avant///après/) | Toutes les occurences d'avant sont remplacées par après dans le résultat du globbing |
/globe/(:&) | Répétition de la dernière substitution |
/globe/(:g&) | Répétition globale de la dernière substitution |
1.9.4.2. Variables
La plupart des modificateurs agissent aussi sur les variables. On utilise alors la syntaxe :
${/variable/:/modificateur/}
On peut enchaîner plusieurs modificateurs :
${/variable/:/modificateur_1/:/modificateur_2/}
1.9.5. Fanions
Les fanions s'insèrent aux motifs de globbing pour modifier leur comportement.
(#i) | Rend la suite de la correspondance insensible à la casse |
(#l) | Rend la suite de la correspondance insensible à la casse pour les minuscules |
(#I) | Rend la suite de la correspondance sensible à la casse |
(#a/N/) | Autorise au maximum N erreurs de frappe |
1.9.6. Rétro-références
Les rétro-références peuvent être utilisées dans :
- les remplacements si le motif modifié dépend du motif initial
- les motifs où des sous-motifs doivent être répétés
L'activation des rétro-référence remplit le tableau $match avec chaque sous-motif inclus dans des parenthèses.
(#b) | Active les rétro-références |
(#B) | Désactive les rétro-références |
$match | Tableau des sous-motif |
1.9.7. Variables
Lorsqu'une variable contient un motif de globbing, ce dernier n'est par défaut pas activé. On peut toutefois provoquer la génération des noms de fichiers via l'expression :
${~/variable/}
Ainsi, la suite :
/variable/=* print $/variable/
affiche le caractère « * » tandis que la suite :
/variable/=* print ${~/variable/}
affiche la liste de tous les fichiers du répertoire.
1.9.8. Désactivation
La précommande noglob permet de désactiver la génération de fichiers pour la commande qui suit :
noglob /commande/ /globe-désactivé/
1.10. Tableaux
On rencontre souvent en programmation au moins deux types de variables :
- Les variables de type scalaire, pouvant contenir un nombre, une chaîne de caractères
- Les variables de type tableau pouvant contenir plusieurs éléments de type scalaire
Remarques : dans certains langages de programmation :
- un élément d'un tableau peut également être un tableau. Autrement dit, un tableau peut être imbriqué dans un autre.
- on parle de liste plutôt que de tableau. Je n'emploie pas ce terme ici pour éviter la confusion avec les listes de mots, concept fréquemment utilisé par les shells.
1.10.1. Déclaration
On peut déclarer une variable comme étant un tableau par :
typeset -a /tableau/
1.10.2. Éléments
La syntaxe :
/tableau/=(/element_1 element_2 ... element_N/)
définit ou modifie un tableau.
1.10.3. Indices
On accède à un élément d'un tableau par :
/tableau/[/indice/]
Précisons que cet accès peut servir autant en lecture :
print $/tableau/[/indice/]
qu'en écriture :
/tableau/[/indice/]=/valeur/
Les indices positifs sont comptés à partir de 1 au début du tableau et les indices négatifs à partir de la fin. L'élément :
$/tableau/[2]
est donc le deuxième et :
$/tableau/[-2]
l'avant-dernier.
1.10.4. Tranches
On peut accéder à un sous-tableau contenant les éléments M à N :
$/tableau/[/M/,/N/]
1.10.5. Tout le tableau
Notons la notation particulière :
$/tableau/[*]
décrivant tout le tableau, et donc équivalente à :
$/tableau/[1,-1]
1.10.5.1. Guillemets
La notation :
$/tableau/[@]
est semblable à :
$/tableau/[*]
mais elle est affichée comme une suite de mots même entre guillemets doubles :
"$/tableau/[@]"
Pour s'en convaincre, supposons que :
/tableau/=(/abc/ /xyz/)
La commande :
print -l "$/tableau/[*]"
affichera :
/abc/ /xyz/
tandis que :
print -l "$/tableau/[@]"
affichera :
/abc/ /xyz/
La syntaxe :
${(@)/tableau/}
produira le même effet que :
$/tableau/[@]
1.10.6. Éclatement en tableau
Une variable contenant des espaces, du type :
/variable/="/abc/ /def/ /.../ /uvw/"
peut être éclatée en un tableau de mots au moyen la syntaxe :
${(z)/variable/}
On obtient le même effet en éclatant en mots puis en insérant la liste dans les parenthèses servant à définir la valeur d'un tableau :
( ${=/variable/} )
1.10.7. Fusion
Supposons que :
/tableau/=( /abc/ /def/ /.../ /uvw/ )
On peut fusionner les éléments d'un tableau en une seule chaîne de caractère au moyen de la syntaxe :
${(j//Séparateur//)/tableau/}
Le résultat s'écrira :
"/abc//Séparateur//def//Séparateur//...//Séparateur//uvw/"
1.10.8. Redirections
Il est possible de former un tableau à partir d'un fichier, à raison d'un élément par ligne. On utilise la syntaxe :
/tableau/=( ${(f)"$(< /fichier/)"} )
1.10.9. Scalaires
$#/tableau/ | Nombre d'éléments d'un tableau |
${#/tableau/} |
1.10.10. Recherche
$/tableau/[(r)/motif/] | Recherche du motif dans les éléments en partant du début du tableau |
$/tableau/[(R)/motif/] | Recherche du motif dans les éléments en partant de la fin du tableau |
$/tableau/[(i)/motif/] | Comme la recherche avec (r), mais retourne l'indice |
$/tableau/[(I)/motif/] | Comme la recherche avec (R), mais retourne l'indice |
1.10.11. Tri
${(o)/tableau/} | Tri alphabétique des éléments |
${(O)/tableau/} | Tri alphabétique inverse des éléments |
${(oi)/tableau/} | Tri insensible à la casse |
${(Oi)/tableau/} | Tri inverse insensible à la casse |
1.10.12. Unicité
${(u)/tableau/} | Chaque élément du tableau n'est repris qu'une fois |
1.10.13. Expansion tensorielle
Supposons que :
/tableau_1/=(/T_1_ T_2_ T_3_/) /tableau_2/=(/U_1 U_2/)
La commande :
print ${^/tableau_1/}${^/tableau_2/}
affiche :
/T_1_//U_1/ /T_1_//U_2/ /T_2_//U_1/ /T_2_//U_2/ /T_3_//U_1/ /T_3_//U_2/
1.10.14. Expansion hybride
Supposons que :
/tableau/=(/ELT_1 ELT_2 ... ELT_N/)
La commande :
print "/abc/${/tableau/}/xyz/"
affiche sans surprise :
/abc//ELT_1 ELT_2 ... ELT_N//xyz/
Il est possible de reproduire le contexte pour chaque élément du tableau. La commande :
print "/abc/${^/tableau/}/xyz/"
affiche :
/abc//ELT_1//xyz/ /abc</bleu>/ELT_2//xyz/ /.../ /abc//ELT_N//xyz/ /.../
1.10.15. Globalisation
On peut utiliser la génération de fichiers pour remplir un tableau via la syntaxe :
/tableau/=( /globbing/ )
Les éléments du tableau seront alors les fichiers générés.
1.10.16. Modificateurs
La plupart des modificateurs agissent aussi sur les tableaux. On utilise alors la syntaxe :
${/tableau/:/modificateur/}
Le modificateur est alors appliqué à chaque élément du tableau.
1.11. Dictionnaires
Un dictionnaire, ou table de hachage, est un tableau particulier qui associe des clés à des valeurs.
1.11.1. Déclaration
On peut déclarer une variable comme étant un dictionnaire par :
typeset -A /dictionnaire/
1.11.2. Éléments
La syntaxe :
/dictionnaire/=(/clé_1 val_1 clé_2 val_2 .../)
définit ou modifie un dictionnaire.
1.11.3. Indices
On accède à un élément d'un dictionnaire par :
/dictionnaire/[/clé/]
Précisons que cet accès peut servir autant en lecture :
print $/dictionnaire/[/clé/]
qu'en écriture :
/dictionnaire/[/clé/]=/valeur/
1.11.4. Clés et valeurs
${(k)/dictionnaire/} | Renvoie un tableau contenant les clés |
${(v)/dictionnaire/} | Renvoie un tableau contenant les valeurs |
${(kv)/dictionnaire/} | Renvoie un tableau contenant les clés et les valeurs |
1.11.5. Recherche
$/dictionnaire/[(i)/motif/] | recherche de la première correspondance au motif dans les clés |
$/dictionnaire/[(I)/motif/] | recherche de toutes les correspondances au motif dans les clés |
$/dictionnaire/[(r)/motif/] | recherche de la première correspondance au motif dans les valeurs |
$/dictionnaire/[(R)/motif/] | recherche de toutes les correspondances au motif dans les valeurs |
1.12. Environnement
1.12.1. Variable d'environnement
Une variable ordinaire n'est accessible que depuis le shell courant. Pour qu'une variable soit également accessible dans les sous-processus lancés par le shell courant, il faut la déclarer en utilisant le mot clef export :
export /variable/=/valeur/
Une telle variable est nommée variable d'environnement. Voici quelques exemples de variables d'environnements :
SHELL | Shell |
USER | Utilisateur |
HOME | Répertoire personnel |
LANG | Langue et encodage par défaut |
NNTPSERVER | Serveur de nouvelles |
1.12.1.1. Chemins d'accès
Certaines variables d'environnement contiennent des chemins d'accès séparés par des « : ». C'est le cas de la variable PATH, qui contient les chemins d'accès aux éxécutables :
export PATH=/cheminA/:/cheminB/:/.../
Voici quelques autres variables contenant des chemins d'accès :
MAILPATH | Chemins d'accès aux courriels |
PYTHONPATH | Chemins d'accès aux exécutables python |
1.12.1.2. Chemin vers une commande
La notation :
=/commande/
donne le chemin complet du fichier exécutable correspondant à la commande. Par exemple :
print =/commande/
affiche ce chemin et :
cat =/script/
affiche le contenu d'un script
1.12.2. Tableaux associés aux variables d'environnements
Le shell zsh associe un tableau aux variables d'environnement contenant des chemins d'accès. Les deux-points y sont remplacés par des espaces. La syntaxe :
path=/cheminA/:/cheminB/:/.../
est équivalente à :
export PATH=/cheminA/:/cheminB/:/.../
Autres exemples :
mailpath | MAILPATH |
1.13. Scripts
Lorsqu'on exécute souvent une même série de commandes, il est possible des les sauvegarder dans un fichier :
/ligne_de_commande-1/ /ligne_de_commande-2/ / ......./ /ligne_de_commande-N/
On rend ensuite le fichier exécutable par :
chmod u+x /fichier/
Il suffit ensuite d'exécuter le fichier en indiquant son chemin absolu :
//chemin-absolu///fichier/
ou, si le fichier est dans le répertoire courant :
.//fichier/
La suite de commandes sera alors exécutée à chaque exécution du fichier. On appelle script un tel fichier. Bien entendu, un script peut contenir autre chose que de simples lignes de commandes : variables, fonctions, conditions, structures de contrôle permettent de le transformer en programme plus évolué.
1.13.1. Lancement
Pour lancer un script avec son chemin absolu :
//chemin-absolu///script/
Pour lancer un script du répertoire courant :
.//script/
Le plus simple est encore de placer le script dans un répertoire contenu dans la variable d'environnement $PATH. On le lance alors simplement par :
/script/
1.13.2. Eval
La commande eval exécute une chaine de caractère, mono ou multiligne. Exemple :
/var/=`cat /fichier/` eval $/var/
1.13.3. Source
Pour lancer un script, le shell crée un nouveau processus dans lequel le script est exécuté. Si on désire exécuter le script dans le processus courant, on fait :
source /chemin///script/
ou, si le script est dans $PATH :
source /script/
1.13.4. Interpréteur
Par défaut, le shell exécute un script en lançant une nouvelle instance de lui-même qui va exécuter les commandes contenues dans le fichier. On peut toutefois demander que l'exécution du script soit effectuée par un interpréteur de commande donné. On insère alors la syntaxe :
#!/interpréteur/
à la première ligne du fichier. En fait, les caractères « #! » doivent être les deux premiers du fichier. Voici quelques exemples d'interpréteurs de commandes de type shell :
#!/bin/sh | Début d'un script shell standard |
#!/bin/zsh | Début d'un script shell zsh |
#!/bin/bash | Début d'un script shell bash |
#!/bin/csh | Début d'un script c-shell |
#!/bin/tcsh | Début d'un script tenex-c-shell |
#!/bin/ksh | Début d'un script korn shell |
et quelques exemples d'autres langages de script :
#!/usr/bin/perl | Début d'un script perl |
#!/usr/bin/python | Début d'un script python |
#!/usr/bin/ruby | Début d'un script ruby |
1.13.5. Valeurs des variables internes
Une variable utilisée dans un script peut recevoir une valeur dans la ligne de commande appelante :
/variable/=/valeur/ /script/
La variable est alors accessible dans le code du script et uniquement dans celui-ci.
1.13.6. Arguments
Tout comme n'importe quelle commande, un script peut être appelé avec des arguments :
/script/ /argument_1/ /argument_2/ /.../ /argument_N/
Dans le code du script, ces arguments sont disponibles via des variables particulières :
0 | Nom du script en cours d'exécution |
1, 2, 3, … | Arguments passé au script |
# | Nombre d'arguments du script |
* | Liste des arguments |
@ |
Les valeurs correspondant à ces variables s'obtiennent, comme pour n'importe quelle variable, en ajoutant un « $ » devant leur nom :
$0 | Nom du script en cours d'exécution |
$1, $2, $3, … | Arguments passé au script |
${10}, ${11}, … | Les arguments de plusieurs chiffres nécessitent la forme avec accolades |
$# | Nombre d'arguments du script |
$* | Liste des arguments |
$@ |
1.13.6.1. Modifications
La commande set permet de modifier les variables associées aux arguments. Après l'instruction :
set /valeur1/ /valeur2/ /valeur3/ /.../
on aura les égalités :
$1 = /valeur1/ $2 = /valeur2/ $3 = /valeur3/ ...
On peut également modifier la variable associée à l'argument N en utilisant la syntaxe :
/N/=/valeur/
On aura alors l'égalité :
$/N/ = /valeur/
La commande shift décale les variables $1, $2, $3, … en laissant tomber $1. Après :
shift
on aura :
$2 —> $1 $3 —> $2 $4 —> $3 ...
Si N est un entier, la commande :
shift /N/
décale les variables $1, $2, $3, … de N positions.
1.13.6.2. Liste des arguments
Les valeurs $* et $@ donnent toutes deux la liste des arguments. Le shell considère :
$*
comme une suite de mots. Par contre :
"$*"
est considéré comme un seul mot à cause des guillemets. Le cas de $@ est légèrement différent. Le shell considère :
$@
comme une suite de mots, et il en va de même pour :
"$@"
malgré les guillemets.
En fait, si on veut passer tous les arguments du script à une commande qu'il est chargé d'exécuter, le mieux est généralement d'écrire :
/commande/ "$@"
1.13.7. Variables spéciales
$$ | Identifiant du processus courant |
$! | Identifiant du dernier processus lancé en arrière-plan |
$? | Code de sortie de la dernière commande exécutée (0 si réussie, autre nombre sinon) |
$- | Variable contenant les options actives du shell |
1.13.8. Remplacement du shell
La commande :
exec /commande/
remplace le shell exécutant le script par commande. Ce peut être utile afin d'éviter la création d'un processus superflu. Le cas typique est celui du script uniligne, ou alors en lançant la dernière commande du script :
#!/bin/sh ... exec /commande/
1.13.9. Sortie
L'instruction exit termine le script et renvoie un code de sortie N :
exit /N/
où N est un entier compris entre 0 et 255.
1.13.10. Groupement
Le groupement par parenthèses crée un sous-shell exécutant une suite de commandes :
( /commande1/ ; /commande2/ ; /.../ ; /commandeN/ )
Le groupement par accolades exécute une suite de commandes vue comme une commande unique dans le shell courant :
{ /commande1/ ; /commande2/ ; /.../ ; /commandeN/ ; }
1.13.10.1. Redirections
Un groupe de commande est également une commande, avec ses canaux d'entrée et sortie qui peuvent être redirigés :
( /.../ ; /.../ ; /.../ ) > /fichier/ { /.../ ; /.../ ; /.../ } > /fichier/
Cette technique peut donc être utilisée pour agréger la sortie de plusieurs commandes en un seul flux. Mais ce n’est pas la seule utilisation possible. Ainsi, pour obtenir une version de print qui affiche à l’erreur standard, on utilise :
{ print "/texte/" 1>&2 }
1.13.11. Options
La commande set permet entre-autres de modifier les options du shell :
set -x | Active les informations de débugage commande : affiche chaque commande avant de l'exécuter |
---|---|
set +x | Désactive les informations de débugage commande |
set -v | Active les informations de débugage ligne : affiche chaque ligne avant de l'exécuter |
set +v | Désactive les informations de débugage ligne |
set -u | Active les messages d'erreur pour toute variable non déclarée |
set +u | Désactive les messages d'erreur des variables non déclarée |
set -a | Transforme toute variable déclarée ou modifiée dans le script en variable d'environnement |
set +a | Désactive -a |
1.14. Configuration
1.14.1. Fichiers d'initialisation
Le shell zsh lit sa configuration dans plusieurs fichiers :
- Le fichier ~/.zshrc, lu à chaque démarrage d'un zsh intéractif
- Le fichier ~/.zshenv, contenant les initialisations des variables d'environnement
- Le fichier ~/.zprofile, lu à chaque démarrage d'un zsh de session
- Le fichier ~/.zlogin, lu à chaque démarrage d'un zsh de session
- Le fichier ~/.zlogout, lu à chaque fermeture de session zsh
Le mode intéractif est simplement celui correspondant à l'interpréteur de commande, par opposition au shell non intéractif exécutant un script. L'option -i peut forcer le mode intéractif :
zsh -i
Un zsh de session (on dit aussi de login) s'obtient par :
zsh -
ou :
zsh -l
1.15. Fonctions
Une fonction se définit par la syntaxe :
function fonction () {
/commande(s)/
}
On peut passer des arguments à une fonction :
/fonction/ /argument1/ /.../ /argumentN/
Ces arguments peuvent être utilisé dans la définition de la fonction sous les noms $1, $2, $3, etc. Exemple :
function fonction () {
... $1 ...
}
L'instruction return permet de quitter la fonction avec un code de retour :
function fonction () {
/commande(s)/ return /N/
}
1.16. Conditions
La logique d'un shell est particulière : la valeur vraie est associée à une commande qui réussit (code de retour 0) et la valeur fausse à une commande qui échoue (codes de retour non nuls).
Les commandes logiques élémentaires sont :
: | Commande nulle : ne fait rien et retourne vrai |
true | Ne fait rien, retourne vrai |
false | Ne fait rien, retourne faux |
1.16.1. Nombres
[ A -eq B ] | Vrai si le nombre A est égal au nombre B |
(( A == B )) | |
[ A -ge B ] | Vrai si le nombre A est plus grand que le nombre B |
(( A >= B )) | |
[ A -le B ] | Vrai si le nombre A est plus petit que le nombre B |
(( A <= B )) | |
[ A -gt B ] | Vrai si le nombre A est strictement plus grand que le nombre B |
(( A > B )) | |
[ A -lt B ] | Vrai si le nombre A est strictement plus petit que le nombre B |
(( A < B )) |
1.16.2. Variables
La valeur d'une variable « $<span class="bleu">variable/ » peut bien entendu s'utiliser partout à la place d'une chaîne de caractères ou d'un nombre. Il existe en plus certains tests propres aux variables.
${+/variable/} | Renvoi vrai si la variable est définie |
1.16.3. Fichiers
[ -e fichier ] | Vrai si le fichier existe |
[ -f fichier ] | Vrai si le fichier existe et est un fichier régulier |
[ -d repertoire ] | Vrai si le repertoire existe et est un répertoire |
[ -L lienSymbolique ] | Vrai si le lienSymbolique existe et est un lien symbolique |
[ fichier1 -nt fichier2 ] | Vrai si fichier1 est plus récent que fichier2 |
[ fichier1 -ot fichier2 ] | Vrai si fichier1 est plus ancien que fichier2 |
1.16.4. Remarque
Notons que dans d'autres langages de programmation comme python, c'est l'inverse : les valeurs non nulles sont vraies et une valeur nulle est fausse.
1.17. StructuresDeControle
1.17.1. Structures conditionnelles uniligne
[ condition ] && commande | Exécute la commande uniquement si la condition est vraie |
[ condition ] ¦¦ commande | Exécute la commande uniquement si la condition est fausse |
La suite de commandes :
( /commande1/ ; exit 0 )
réussit toujours. Par conséquent, la structure :
/condition/ && ( /commande1/ ; exit 0 ) || /commande2/
va exécuter commande1 si la condition est vraie et commande2 dans le cas contraire.
1.17.2. Structure if
La structure if permet d'exécuter conditionnellement une suite de commandes. La forme la plus simple est :
if [ /condition/ ] then /commande(s)/ fi
Dans la forme suivante, la suite commande(s)-1 est exécutée si la condition est vraie. Dans le cas contraire, c'est la suite commande(s)-2 qui est exécutée :
if [ /condition/ ] then /commande(s)-1/ else /commande(s)-2/ fi
Dans la forme suivante, la suite commande(s)-1 est exécutée si la condition-1 est vraie. Si la condition-1 est fausse mais que la condition-2 est vraie, la suite commande(s)-2 est exécutée. Si les deux conditions sont fausses, c'est la suite commande(s)-3 qui est exécutée :
if [ /condition-1/ ] then /commande(s)-1/ elif [ /condition-2/ ] then /commande(s)-2/ else /commande(s)-3/ fi
Avec « et » :
if [ /condition1/ -a /condition2/ ] then /commande/ fi
Avec « ou » :
if [ /condition1/ -o /condition2/ ] then /commande/ fi
Avec « et » sur des commandes :
if /commande1/ && /commande2/ then /commande/ fi
Avec « ou » sur des commandes :
if /commande1/ || /commande2/ then /commande/ fi
1.17.3. Structure case
La structure case compare une variable avec une série de motifs de type globbing. Au premier motif qui correspond avec le contenu de la variable, les commandes correspondantes sont exécutées et le shell sort de la structure. La forme générique est :
case /variable/ in /motif-1/) /commande(s)-1/ ;; /motif-2/) /commande(s)-2/ ;; ... /motif-N/) /commande(s)-N/ ;; esac
Un motif du type :
/motif-1/ | /motif-2/ )
correspondra avec la variable si motif-1 ou motif-2 correspond
Cet exemple applique une série de commandes dans le cas où la variable contient un nom de fichier html ou php et une autre série de commandes dans le cas contraire :
case /variable/ in *.html | *.php) /commande(s)-1/ ;; *) /commande(s)-2/ ;; esac
1.17.4. Boucle for
La boucle for applique une même opération à tous les éléments d'une liste. La forme générique est :
for /variable/ in /liste/ do ... $/variable/ ... done
Si aucune liste, n'est donnée, la boucle sera appliquée à $1, $2, $3, etc. Ainsi :
for /variable/ do ... $/variable/ ... done
est équivalent à :
for /variable/ in $1 $2 $3 ... do ... $/variable/ ... done
Exemple : appliquer la même opération à une liste de valeurs données :
for /variable/ in /val1 val2 ... valN/ do ... $/variable/ ... done
Exemple : appliquer la même opération à tous les fichiers d'un répertoire :
for /fichier/ in * do /commande/ $/fichier/ done
Exemple : appliquer la même opération à tous les fichiers se terminant par .ogg :
for /fichier/ in */.ogg/ do /commande/ $/fichier/ done
1.17.5. Boucle while
La boucle while exécute une même série de commandes jusqu'au moment où une condition devient fausse. Cette boucle dispose d'une entrée et d'une sortie standard. La forme générique est :
while /condition/ do /commande/ done
On peut appliquer une même commande à chaque ligne d'un fichier, il suffit de rediriger l'entrée standard d'une boucle while vers ce fichier :
while read /ligne/ do /commande/ $/ligne/ done < /fichier/
On peut également rediriger la sortie de la boucle :
while read /ligne/ do /commande/ $/ligne/ done < /fichier/ > /sortie/
On peut appliquer une même commande commande2 à chaque ligne de la sortie d'une autre commande commande1, il suffit de rediriger l'entrée standard de commande1 vers une boucle while :
/commande1/ | while read /ligne/ do /commande2/ $/ligne/ done
1.17.6. Break et continue
L'instruction break sert à sortir d'une boucle for ou while.
L'instruction continue sert à aller directement à la prochaine itération d'une boucle for ou while.
1.18. Abréviations
Le shell permet de définir des abréviations de commandes. On nomme alias de telles abréviations.
alias surnom/=/commande | Définit un alias pour une commande |
alias -g surnom/=/nom | Alias global d'une commande, d'un fichier ou autre |
alias -s suffixe/=/application | .//nom/./suffixe/ correspondra à : application nom./suffixe/ |
1.18.1. Répertoires nommés
hash -d nom/=/chemin | Définit un répertoire nommé |
cd ~/nom/ | Se déplace vers un répertoire nommé |
1.19. Édition de la ligne de commande
1.19.1. Fonctions d'éditions et combinaisons
Les combinaisons de touches permettant d'éditer la ligne de commande sont associées à des fonctions d'édition via l'instruction « bindkey » :
bindkey /combinaison/ /fonction-edition/
1.19.1.1. Personnalisées
On peut créer une fonction personnalisées (voir plus loin) et signaler ensuite à l'éditeur de commande de zsh (zle pour zsh line editor) que cette fonction est utilisable pour l'édition via :
zle -N /fonction/
Il ne reste plus alors qu'à associer cette fonction à une combinaison clavier :
bindkey /combinaison/ /fonction/
Il est possible de définir explicitement une fonction personnalisée dans un des fichiers d'initialisation, comme le zshrc. On peut aussi utiliser le mécanisme d'autoload permettant le chargement à la demande. Il faut alors sauver le corps de cette fonction dans un fichier portant son nom. Ce fichier devra être alors situé dans un des répertoires de la variable « fpath ». On charge ensuite cette fonction par :
autoload -U /fonction/
1.19.1.2. Action quelconque
Il existe bien entendu de nombreuses combinaisons par défaut, dont certaines sont décrites dans la suite de cette section. Dans le cas où aucune combinaison n'est associée à une fonction particulière, où qu'on ne s'en rappelle plus, il est possible d'accéder à cette fonction par son nom, au moyen de l'instruction :
<alt x>
ou :
<esc> x
Cette instruction présente un prompt qui permet d'entrer le nom de la fonction souhaitée. La complétion y est disponible.
1.19.1.3. Éditeur
Il est possible d'utiliser son éditeur favori (contenu dans les variables d'environnement $VISUAl ou $EDITOR) pour éditer une ligne de commande. La configuration suivante :
autoload -U edit-command-line zle -N edit-command-line bindkey '\ee' edit-command-line
définit la combinaison « <esc> e » ou <alt e> comme déclencheur de cette fonction.
1.19.2. Générique
<ctrl g> | Annule la ligne de commande |
<alt h> | Lance l'aide sur la commande |
<esc> h | |
<alt '> | Place la ligne de commande entre guillements en utilisant des caractères d'échappement si nécessaire |
<esc> ' |
1.19.3. Déplacements
<ctrl a> | Va au début de la ligne de commande |
<home> | |
<ctrl e> | Va à la fin de la ligne de commande |
<end> | |
<alt f> | Avance d'un mot dans la ligne de commande |
<esc> f | |
<alt b> | Recule d'un mot dans la ligne de commande |
<esc> b | |
<ctrl f> | Avance d'un caractère |
<right> | |
<ctrl b> | Recule d'un caractère |
<left> |
1.19.4. Modifications
<ctrl u> | Supprime la ligne de commande |
<ctrl k> | Supprime jusqu'à la fin de la ligne |
<ctrl w> | Supprime le mot précédant le curseur |
<alt d> | Supprime jusqu'à la fin du mot |
<esc> d | |
<alt t> | Échange les deux derniers mots |
<esc> t |
1.19.5. Copier, coller
<ctrl @> | Place la marque à l'endroit du curseur |
<alt w> | Copie la région de la marque au curseur |
<esc> w | |
<ctrl y> | Colle le dernier texte copié ou supprimé |
<alt y> | Après un collage, va en arrière dans la pile des textes supprimés |
<shift ins> | Colle le contenu du presse-papier |
1.19.6. Répétitions
<alt a> | Exécute la ligne et l'affiche à nouveau |
<esc> a |
1.19.7. Annulation
<ctrl x> u | Annule la dernière action |
1.19.8. Pile
La fonction d'édition « push-line-or-edit », associée par défaut à la combinaison :
<alt q>
ou :
<esc> q
place la ligne de commande en cours d'édition sur une pile, puis l'efface pour permettre d'entrer une autre ligne de commande. Une fois cette autre ligne entrée et exécutée, la commande antérieure est retirée de la pile et affichée à nouveau.
On peut ajouter plusieurs lignes successives dans la pile en utilisant « <alt q> » plusieurs fois de suite. Dès qu'une commande entrée est exécutée de façon classique avec « <Return> », la ligne la plus haute dans la pile (si cette dernière n'est pas vide) est retirée et affichée.
1.19.9. Correction
<ctrl x> c | Propose des corrections du mot courant |
1.19.10. Échappement
La combinaison <ctrl v> permet d'écrire littéralement une touche ou une combinaison de touches ayant un effet spécial. Par exemple, la suite :
<ctrl v> <ctrl u>
affichera le caractère <ctrl u> sous la forme ^U, sans l'effet habituel qui efface la ligne de commande.
1.20. Complétion
La complétion permet de compléter les débuts de mots dans les lignes de commandes en utilisant les possibilités disponibles.
1.20.1. Options
autoload -U compinit compinit | Complétion |
setopt autolist setopt listtypes | Complétion avancée |
setopt automenu setopt completeinword | |
setopt alwaystoend |
1.20.2. Fonctionnement
La touche activant la complétion est simplement la tabulation. Elle agit de différentes façons suivant le contexte :
- Si le mot en cours peut être complété partiellement ou totalement de façon non ambiguë, la tabulation complète le mot
- Si il existe plusieurs solutions possible, la tabulation les affiche
- Si les solutions sont déjà affichées, la tabulation permet d'accéder au menu
Petit exemple, dans un répertoire qui contient bidule.html et bidule.tex. Si on tape :
ls bid
une première tabulation complètera la partie non ambiguë :
ls bidule
Une deuxième tabulation affichera les solutions :
bidule.html bidule.tex
et une troisième tabulation accèdera au menu correspondant, permettant de sélectionner la solution désirée.
Remarque : ce comportement peut changer suivant les options, mais l'idée générale reste la même.
1.20.3. Combinaisons
<tab> | Complétion standard |
<ctrl d> | Liste les choix possibles |
<alt ,> | Complète par les mots de l'historique |
<alt .> | Insère le dernier mot de la commande précédente |
1.20.4. Personnalisation
fignore=(liste des suffixes) | Suffixes à ignorer lors de la complétion |
compctl -k (liste d'arguments) /commande | La complétion après commande sera choisie |
dans la liste d'arguments | |
compctl -g 'motif' commande | La complétion après commande sera choisie |
parmi les fichiers correspondant au motif | |
compctl -s '$(comListe)' commande | La complétion après commande sera choisie |
dans la liste correspondant à la sortie de comListe | |
compctl -f commande | La complétion après commande sera choisie parmi les fichiers |
compctl -c commande | La complétion après commande sera choisie parmi les commandes |
1.21. Historique des commandes
1.21.1. Options
Avec ces options :
bindkey '/codeToucheUp/' history-beginning-search-backward bindkey '/codeToucheDown/' history-beginning-search-forward
les flèches haut et bas donnent accès à l'historique des commandes correspondant à la partie déjà frappée. Par exemple, si l'historique contient :
ls bidule ls -l tutu pwd ls -l toto ls machin cd repertoire
et que l'on tape :
ls -l (flèches vers le haut)
on aura accès sucessivement à :
ls -l toto ls -l tutu
Les codes des touches dépendent du type de terminal. Ils s'obtiennent par :
<ctrl v> <up> <ctrl v> <down>
1.21.2. Commandes
fc -l N1 N2 | Liste de l'historique du numéro N1 à N2 |
<ctrl p> | Affiche la commande précédente |
<up> | |
<ctrl n> | Affiche la commande suivante |
<down> | |
<ctrl o> | Exécute la ligne et affiche la ligne suivante dans l'historique |
!/N/ | Ligne de commande numéro N de l'historique |
!-N | N lignes de commandes avant |
1.21.3. Recherche
<ctrl r> | Recherche d'une commande en arrière dans le temps |
En mode recherche, aller à l'occurence précédente | |
<ctrl x> r | Recherche d'une commande en arrière dans le temps |
En mode recherche, aller à l'occurence précédente | |
<ctrl x> s | Recherche d'une commande en avant dans le temps |
En mode recherche, aller à l'occurence suivante | |
!/motif/ | Commande précédente commençant par le motif |
!?/motif/? | Commande précédente contenant par le motif |
!% | Dernier motif de recherche |
1.21.4. Complétion
<alt p> | Complétion du premier mot par la ligne de commande précédente dans l'historique |
<esc> p |
<td><alt n></td> <td>Complétion du premier mot par la ligne de commande suivante dans l'historique</td> </tr>
<esc> n |
1.21.5. Arguments
!/N/:0 | Ligne de commande numéro N de l'historique, argument 0 (début de ligne, commande) |
!/N/:/I/ | Ligne de commande numéro N de l'historique, /I/<sup>ème</sup> argument |
!/N/:$ | Ligne de commande numéro N de l'historique, dernier argument (fin de ligne) |
!/N/:/I/-J | Ligne de commande numéro N de l'historique, du /I/<sup>ème</sup> au /J/<sup>ème</sup> argument |
!/N/:* | Équivalent à !/N/:1-$ |
1.21.6. Modificateurs
!/N/:s//motif1///motif2// | Ligne de commande numéro N de l'historique, avec motif1 remplacé par motif2 |
1.21.7. Dernière commande
!! | Dernière ligne de commande, équivalent à !-1 |
!:/I/ | Dernier (I + 1)<sup>ème</sup> mot |
!!:s//motif1///motif2// | Dernière ligne de commande, avec motif1 remplacé par motif2 |
1.21.8. Édition
fc | Lance un éditeur sur la dernière commande |
fc mot | Lance un éditeur sur la dernière ligne de commande commençant par mot |
fc avant/=/après mot | Lance un éditeur sur la dernière ligne de commande commençant par mot, en modifiant chaque occurence de avant par après |
fc N | Lance un éditeur sur la commande N de l'historique |
vared variable | Édition d'une variable, les modifications sont enregistrées lorsqu'on fait <Return> |
1.22. Conventions
Ces conventions ne fonctionnent pas pour toutes les commandes, mais de nombreuses commandes les respectent.
commande -lettre | Option courte | |
commande --chaine | Option longue | |
commande - | Le tiret « - » demande à une commande d'aller chercher son entrée sur l'entrée standard | |
commande1 | commande2 - | Demande à la seconde commande d'aller chercher son entrée à la sortie de la première commande |
commande options – fichiers | – Signale la fin des options Utile lorsqu'un nom de fichier commence par - ou -- |
2. Bash
<Ctrl-X> <Ctrl-E> | Édite la commande dans un éditeur |
3. Expressions régulieres
3.1. Généralites
Les expressions régulières permettent de faire des recherches et substitutions évoluées. Par défaut, une expression régulière essaie d'englober un maximum de caractères.
3.2. Caractères
caractère | Correspond à un caractère ordinaire |
\/caractère/ | Correspond à un caractère ayant autrement une signification particulière |
\. | Point « . » |
\[ | Crochet « [ » |
\] | Crochet « ] » |
3.3. Groupes de caractères
. | N'importe quel caractère, sauf fin de ligne |
[/groupe de caractères/] | N'importe quel caractère du groupe |
[^/groupe de caractères/] | N'importe quel caractère tant qu'il |
n'appartient pas au groupe et n'est pas | |
une fin de ligne | |
[/A/-/Z/] | Caractères entre A et Z |
[0-9] | Chiffres |
[A-Z] | Majuscules |
[a-z] | Minuscules |
[0-z] | Alphanumériques |
3.3.1. Expressions étendues
(motif1 | motif2) | motif1 ou motif2 |
3.4. Frontières
^ | Début de ligne |
$ | Fin de ligne |
\< | Début de mot |
\> | Fin de mot |
3.5. Quantités
/x/* | 0 ou plus d'occurence(s) de x |
x\{N\} | Exactement N occurences de x |
x\{M, N\} | Entre M et N occurences de x |
x\{M, \} | Au moins M occurences de x |
x\{,/N/\} | Au plus N occurences de x |
3.5.1. Expressions étendues
x? | 0 ou 1 occurence de x |
/x/+ | 1 ou plus d'occurence(s) de x |
3.6. Rétro-références
Les rétro-références peuvent être utilisées dans :
- les remplacements si le motif modifié dépend du motif initial
- les motifs où des sous-motifs doivent être répétés
& | Fait référence au dernier motif rencontré |
\(/...../\) | Permettent d'isoler un sous-motif |
\/N/ | Fait référence au N/<sup>ème</sup> sous-motif désigné par des parenthèses : \(/sousMotif\) |
3.6.1. Expressions étendues
Dans les expressions régulières étendues, les parenthèses isolant les sous-motifs ne sont pas précédées par des backslashs \ :
(…..) | Permettent d'isoler un sous-motif |
4. Sed
4.1. Structure
Sed signifie « stream editor », éditeur de flux. Il permet de modifier un flux de texte, en opèrant ligne par ligne et en utilisant entrée et sortie standard.
sed 'commandeSed' | Sed en mode bavard, affiche toutes les lignes |
sed -n 'commandeSed' | Sed en mode silencieux, n'affiche que sur demande |
Une commande sed se décompose généralement en une condition restrictive suivie d'une ou plusieurs instructions. Les accolades permettent de grouper des instructions sur une même condition. Lorsqu'il y a plus d'une instruction par ligne, on les sépare par des points-virgules :
'/condition/ { /instruction-1/ ; /instruction-2/ ; /.../ }'
Dans les scripts, on dispose généralement une instruction par ligne :
#!/bin/sed -f /condition-1/ { /instruction-1-1/ /instruction-2-1/ /.../ } /condition-2/ { /instruction-2-1/ /instruction-2-2/ /.../ } /.../
4.1.1. Mode positif
Le mode positif correspond au sed bavard. Il s'utilise en ligne de commande sous la forme :
sed '/commandeSed/'
ou, dans un script :
#!/bin/sed -f /commandeSed/
4.1.2. Mode négatif
Le mode négatif correspond au sed silencieux. Il s'utilise en ligne de commande sous la forme :
sed -n '/commandeSed/'
ou, dans un script :
#!/bin/sed -nf /commandeSed/
4.1.3. Plusieurs commandes
4.1.3.1. Mode positif
En ligne de commande :
sed -e '/commande1/' -e '/commande2/'
Dans un script :
#!/bin/sed -f /commande1/ /commande2/ /...../
4.1.3.2. Mode négatif
En ligne de commande :
sed -n -e '/commande1/' -e '/commande2/'
Dans un script :
#!/bin/sed -nf /commande1/ /commande2/ /...../
4.2. Conditions
4.2.1. Motifs
motif | Vrai si la ligne contient motif |
//motif//I | Vrai si la ligne contient motif, insensible à la casse |
motif1,//motif2// | Vrai de motif1 à motif2 |
4.2.2. Numéros de lignes
N | Vrai sur la ligne N |
M,/N/ | Vrai entre les lignes M à N |
M/~/N | Vrai toutes les N lignes à partir de la ligne M |
N,$ | Vrai à partir de la ligne N |
4.2.3. Hybride
N,//motif// | Vrai de la ligne N jusqu'à motif |
motif,/N/ | Vrai de motif jusqu'à la ligne N |
4.2.4. Négation
motif ! | Vrai si la ligne ne contient pas motif |
N ! | Vrai partout sauf sur la ligne N |
4.3. Affichage
Voici quelques exemples de commandes sed d'affichage. Elles s'utilisent généralement en mode négatif.
M,/N/ p | Affiche les lignes M à N |
motif p | Affiche les lignes contenant motif |
motif1,//motif2// p | Affiche de motif1 à motif2 |
4.3.1. Numéros de lignes
= | Affiche le numéro de ligne |
= ; p | Affiche le numéro de ligne suivi de la ligne |
4.4. Écriture dans un fichier
La commande :
sed -n '/...../ w /fichier/'
est similaire à :
sed -n '/...../ p'
si ce n'est qu'elle écrit dans fichier au lieu de la sortie standard. Les commandes d'écriture s'utilisent généralement en mode négatif.
4.5. Suppression
Voici quelques exemples de commandes sed de suppression. Elles s'utilisent généralement en mode positif.
M,/N/ d | Supprime les lignes M à N |
motif d | Supprime les lignes contenant motif |
motif1,//motif2// d | Supprime de motif1 à motif2 |
4.6. Quitter
N q | Quitte à la ligne N |
motif q | Quitte dès que motif est rencontré |
4.7. Shell
Voici quelques exemples de commandes sed permettant de faire exécuter certaines lignes par le shell. Elles s'utilisent généralement en mode positif.
M,/N/ e | Exécute les lignes M à N |
motif e | Exécute les lignes contenant motif |
motif1,//motif2// e | Exécute de motif1 à motif2 |
4.8. Translittération
y//groupe1///groupe2// | Remplace chaque caractère de groupe1 par son correspondant dans groupe2 |
4.9. Substitution
Voici les commandes sed de substitution. Elles s'utilisent en mode positif lorsqu'on souhaite afficher également les lignes non substituées :
sed '/...../ s//motif1///motif2// /...../'
ou en mode négatif si on désire un affichage sélectif :
sed -n '/...../ s//motif1///motif2//p /...../'
4.9.1. Mode positif
s//motif1///motif2// | Remplace la première occurence de motif1 par motif2 |
s//motif1///motif2///N/ | Remplace la N/<sup>ème</sup> occurence de /motif1 par motif2 |
s//motif1///motif2//g | Remplace chaque occurence de motif1 par motif2 |
s//motif1///motif2///N/g | Remplace toutes les occurences de motif1 à partir de la N/<sup>ème</sup> par /motif2 |
4.9.2. Mode négatif
s//motif1///motif2//p | Écrit les lignes substituées dans la sortie standard |
4.9.3. Rétro-références
& | Fait référence au dernier motif trouvé |
\/N/ | Fait référence au /N/<sup>ème</sup> sous-motif mis entre \( \) |
4.9.4. Restreinte
Voici quelques commandes sed de substitutions restreintes.
M,/N/ s//…..///…..// | Ne traite que les lignes M à N |
motif s//…..///…..// | Ne traite que les lignes contenant motif |
motif1,//motif2// s//…..///…..// | Traite à partir de la ligne contenant motif1 jusqu'à la ligne contenant motif2 |
4.9.5. Caractère de séparation
\/ | Permet de placer un / dans un motif |
s:/…../:/…../: | Autre caractère de séparation, ici : |
\/caractèreDeSéparation/ | Permet de placer le caractère de séparation dans un motif |
4.9.6. Exemples
Exemple : remplacer motif par (motif motif) :
sed 's//motif//(& &)/g' < /entree/ > /sortie/
4.10. Insertion
motif r fichier | Insère fichier juste après motif |
motif a \ Texte | Ajoute du texte après la ligne du motif |
motif i \ Texte | Ajoute du texte avant la ligne du motif |
4.11. Modifications
motif c \ Ligne | Modifie la ligne du motif |
4.12. Multi-lignes
Dans la plupart des commandes sed, l'espace de travail correspond à la ligne en cours de traitement. Il est possible de modifier cet espace de travail.
n | Passe à la ligne suivante |
N | Ajoute la ligne suivante à l'espace de travail |
D | Efface la première ligne de l'espace de travail |
P | Affiche la première ligne de l'espace de travail |
4.13. Mémoire annexe
En plus de l'espace de travail, sed dispose d'une mémoire annexe.
h | Copie l'espace de travail dans la mémoire annexe |
H | Ajoute l'espace de travail dans la mémoire annexe |
g | Copie le contenu de la mémoire annexe dans l'espace de travail |
G | Ajoute le contenu de la mémoire annexe dans l'espace de travail |
x | Échange le contenu des 2 mémoires |
4.14. Étiquettes
:/étiquette/ | Définit une étiquette |
b étiquette | Va à une étiquette |
t étiquette | Va à une étiquette si la dernière substitution a modifié la ligne |
5. Awk
5.1. Généralites
Awk analyse l'entrée standard comme une succession de lignes (enregistrements), chacune contenant plusieurs colonnes (champs). Voici la structure générique d'un code awk :
BEGIN { /Opérations de pré-traitement/ } { /Opérations/ /condition/ { /Opérations/ } END { /Opérations de post-traitement/ }
Le bloc BEGIN est exécuté avant la lecture du fichier, le bloc central pendant et le bloc END après la lecture du fichier. Chaque sous-bloc entre accolades peut être précédé d'une condition qui détermine son exécution éventuelle.
5.1.1. En ligne de commande
awk '/commandesAwk/'
5.1.2. Dans un script
#!/usr/bin/awk -f /commandesAwk/
5.2. Variables
FS | Contient le séparateur de champ du fichier d'entrée <Espace> ou <tab> par défaut |
RS | Contient le séparateur d'enregistrement du fichier d'entrée <Return> par défaut |
OFS | Contient le séparateur de champ du fichier de sortie <Espace> par défaut |
ORS | Contient le séparateur d'enregistrement du fichier de sortie <Return> par défaut |
NF | Contient le nombre de champs de la ligne courante |
NR | Contient le nombre de lignes déjà traitées |
FNR | Contient le nombre de lignes déjà traitées dans le fichier en cours de traitement |
FILENAME | Contient le nom du fichier en cours de traitement |
$0 | Contient toute la ligne |
$1 | Contient le premier champ |
$/N/ | Contient le champ numéro N |
$NF | Contient le dernier champ |
5.2.1. Options
L'option -F permet de modifier le séparateur de champ à l'entrée :
awk -F '/séparateur/' /.../
5.2.2. Script
script variable/=/valeur | Appel d'un script en passant des valeurs aux variables |
5.3. Opérations
/N/++ | Incrémentation |
N-- | Décrémentation |
M % N | Modulo |
M/^/N | Exposant |
5.4. Logique
== | Égal à |
!= | Différent de |
<= | Inférieur ou égal à |
>= | Supérieur ou égal à |
&& | Et |
¦¦ | Ou |
5.5. Expressions régulières
Awk utilise les expressions régulières étendues.
5.5.1. Correspondances
variable ~ motif | Vaut vrai si le contenu de la variable correspond au motif |
variable !~ motif | Vaut vrai si le contenu de la variable ne correspond pas au motif |
motif | Équivalent à $0 ~ motif |
! motif | Équivalent à $0 !~ motif |
5.5.2. Substitutions
sub(motif1,"motif2",/variable/) | La première occurence de motif1 dans variable est remplacée par motif2 |
gsub(motif1,"motif2",/variable/) | Chaque occurence de motif1 dans variable est remplacée par motif2 |
gsub(motif1,"motif2") | Équivalent à gsub(motif1,"motif2",$0) |
5.6. Affichage
Affiche chaînes, variables sur la sortie standard |
5.6.1. Exemples
print $2, $1 | Inverse les deux premières colonnes d'un fichier |
NR % N == 0 { print $0 } | Affiche toutes les N lignes |
5.7. Multi-lignes
getline | Passe à la ligne suivante | |
getline var < fichier | Récupère une ligne dans un fichier et la place dans une variable | |
commande | getline | Récupère la sortie d'une commande |
5.8. Structures
if ( condition ) { … } | Condition |
while ( condition ) { … } | Tant que |
for ( variable in liste ) { … } | Boucle |
function fonction/(…/) { … } | Fonction |
6. Gpg
6.1. Généralités
gpg –gen-key | Génère un couple clé publique, clé privée |
gpg –list-keys | Donne la liste des clés |
gpg –delete-secret-key clé | Supprime une clé privée |
gpg –delete-key clé | Supprime une clé publique |
6.2. Export
gpg –export clé > clé.pub | Exporte une clé publique en binaire |
gpg –armor –export clé > clé.pub | Exporte une clé publique en ascii |
gpg –fingerprint clé > empreinteClé | Empreinte d'une clé |
gpg –keyserver adresseServeur –send-keys clé | Envoie la clé publique vers un serveur |
6.3. Import
gpg –import clé.pub | Importe une clé publique |
gpg –sign-key clé | Certifie une clé importée |
6.4. Révocation
gpg –gen-revoke clé > révocation | Génère un certificat de révocation d'une clé |
gpg –import révocation | Valide une révocation en l'important |
6.5. Édition
La commande :
gpg --edit-key /clé/
accède à un interpréteur de commande permettant d'éditer une clé. En voici les principales commandes :
help | Aide |
uid N | Sélectionne ou désélectionne le /N/<sup>ième</sup> utilisateur |
key N | Sélectionne ou désélectionne la /N/<sup>ième</sup> clé |
adduid | Ajoute un utilisateur de la clé |
deluid | Supprime le ou les utilisateurs sélectionnés |
revuid | Révoque le ou les utilisateurs sélectionnés Nécessaire si la clé a été envoyée vers un serveur |
primary | Marque l'utilisateur sélectionné comme principal |
addkey | Ajoute une sous-clé |
delkey | Supprime la ou les sous-clés sélectionnées |
revkey | Révoque la ou les sous-clés sélectionnées |
list | Informations sur la clé |
fpr | Empreinte de la clé |
passwd | Change le mot de passe de la clé |
save | Enregistre les modifications et quitte |
quit | Quitte |
6.6. Chiffrement
gpg –encrypt –recipient clé fichier | Chiffre un fichier |
gpg –symmetric fichier | Chiffre un fichier symétriquement, protection par mot de passe |
gpg –decrypt fichier.gpg > fichier | Déchiffre un fichier |
6.7. Signature
6.7.1. Crypté et signé
gpg –sign –encrypt fichier > fichier.sig | Génère un message chiffré et signé, format binaire |
gpg –armor –sign –encrypt fichier > fichier.asc | Génère un message chiffré et signé, format ascii |
gpg –sign –symmetric fichier | Génère un message chiffré symétriquement et signé |
gpg –verify fichier | Vérifie un message signé |
gpg –decrypt chiffré > déchiffré | Déchiffre et vérifie un fichier crypté et signé |
6.7.2. Signature uniquement
gpg –detach-sign fichier > fichier.sig | Génère une signature binaire |
gpg –armor –detach-sign fichier > fichier.asc | Génère une signature ascii |
gpg –verify fichier.sig fichier | Vérifie une signature binaire |
gpg –verify fichier.asc fichier | Vérifie une signature ascii |
6.7.3. Document en clair
gpg –clearsign fichier | Génère un fichier contenant le document en clair suivi de sa signature au format ascii |
7. Ssh
Ssh est un shell sécurisé permettant d'accéder à distance à une machine. La syntaxe générique pour ouvrir une connexion de l'utilisateur nom sur la machine hôte au répertoire chemin est la suivante :
ssh /nom/@/hôte/:/chemin/
Le nom de l'utilisateur est optionnel, il est par défaut égal au nom de l'utilisateur sur la machine depuis laquelle on ouvre la connexion. Le répertoire par défaut est le répertoire personnel de l'utilisateur. Ssh peut également simplement exécuter une commande sur la machine distante :
ssh /nom/@/hôte/ /commande/
Ssh comporte aussi d'autres outils respectant la même syntaxe :
sftp | Protocole de transfert de fichiers sécurisé |
scp | Copie à distance sécurisée |
7.1. Clé
ssh-keygen -t dsa | Génère un couple clé publique, privée |
ssh-keygen -l | Liste des clés |
ssh-copy-id -i cléPublique utilisateur/@/machine | Installe la clé publique sur une machine distante |
7.1.1. Ne pas retaper son mot de passe à chaque fois
ssh-agent shell | Lance un shell avec agent d'authentification ssh |
ssh-agent zsh | Lance zsh avec agent d'authentification ssh |
ssh-add | Ajoute une clé au cache de ssh-agent, |
permettant de ne taper le mot de passe de la clé qu'une fois |
7.2. Sshfs
Sshfs permet de monter des répertoires distants en utilisant le protocole ssh.
sshfs utilisateur/@/machine://répertoire/ pointDeMontage | Montage |
fusermount -u pointDeMontage | Démontage |
8. Screen
8.1. Sessions
screen | Lance une session de screen |
screen -S nomSession | Lance une session nommée de screen |
<ctrl a> d | Se détache de la session screen |
screen -ls | Affiche la liste des sessions screen |
screen -rx identifiantSession | S'attache à une session screen existante |
<ctrl a> x | Verrouille la session screen |
8.2. Consoles
<ctrl a> c | Crée une nouvelle console virtuelle dans la session screen courante |
<ctrl a> k | Supprime la console virtuelle courante |
<ctrl a> \ | Supprime toutes les consoles virtuelles et quitte screen |
<ctrl a> n | Passe à la console virtuelle suivante |
<ctrl a> p | Passe à la console virtuelle précédente |
<ctrl a> " | Permet de sélectionner une console virtuelle |
<ctrl a> N | Passe à la /N/<sup>ème</sup> console virtuelle |
<ctrl a> A | Renomme une console virtuelle |
8.3. Mode ligne de commande
<ctrl a> : | Accède au mode ligne de commande de screen |
<ctrl a> :help | Aide |
<ctrl a> :quit | Quitte |
8.4. Mode copie
<ctrl a> [ | Entre en mode copie Permet de se balader dans l'écran à la mode vi |
<ctrl f> | Un écran vers le bas (mode copie) |
<ctrl b> | Un écran vers le haut (mode copie) |
/expression | Recherche vers le bas (mode copie) |
?/expression/ | Recherche vers le haut (mode copie) |
<Espace> | Permet de marquer le début et la fin de la zone à copier (mode copie |
<esc> | Sort du mode copie |
<ctrl a> ] | Colle le texte copié |
8.5. Journalisation
<ctrl a> H | Débute/Termine la journalisation d'un écran |
8.6. Sous-écrans
<ctrl a> S | Divise horizontalement l'écran en deux | |
<ctrl a> | Divise verticalement l'écran en deux | |
<ctrl a> <tab> | Passe sur la partie suivante de l'écran | |
<ctrl a> X | Supprime le sous-écran courant |
8.7. Imbrication
<ctrl a> a commande <ctrl a> a c, ", k, d, … | Envoie une commande à un screen imbriqué dans un autre |
8.8. Configuration
Voici un exemple de fichier de configuration <a href="exemples/screenrc.txt">screenrc</a>.
<a href="../../index.php">Accueil</a>
<a title="Site déposé sur CopyrightFrance.com" href="http://www.copyrightfrance.com/phtml/p_logo1.php" target="_blank"><img border="0" src="images/logsc15.gif" alt="CopyrightFrance.com"></a>