Le shell sans peine
Un article de Wiki de la communauté Mandriva.
CETTE PAGE EST UNE VERSION RÉVISÉE DE SEPT PAGES MAINTENANT OBSOLÈTES DE L'ANCIENNE BASE DE CONNAISSANCES DONT LA PREMIÈRE EST À L'ADRESSES : http://club.mandriva.com/xwiki/bin/view/KB/BasicsBshell ptyxs 24 février 2008 à 08:27 (CET)
[modifier] L'instrument du pouvoir suprême...
Vous entendrez plus d'une fois quelqu'un entonner la complainte sur les « arcanes » de la « ligne de commande », qui serait « dépassée » etc. etc. et selon laquelle les utilisateurs, et les systèmes d'exploitation eux-mêmes, feraient aussi bien de s'en débarrasser...
En fait, il est parfaitement possible d'utiliser Linux sans connaître quoi que ce soit au shell : on peut lancer le système directement dans l'interface graphique X et le quitter à partir de cette même interface. On peut aussi avoir recours au Centre de Contrôle Mandriva Linux ou à Webmin pour configurer tous les aspects du système.
Je suis absolument persuadé, cependant, qu'utiliser Linux sans le shell est comme conduire une voiture en restant tout le temps en première ! Bien sûr, à première vue, c'est plus facile et la plupart du temps vous pouvez aller où vous voulez. Mais ça ne va pas vite et ça ôte à la conduite tout ce qu 'elle peut avoir d'amusant !
Eh oui ! la ligne de commande est amusante !
C'est quelque chose comme la plus vaste accumulation de cubes pour jeu de construction que vous ayez jamais pu voir ! Et ces divers cubes peuvent chacun accomplir des choses tout à fait étonnantes. Qui plus est, vous pouvez les amener à coopérer et à effectuer les tâches les plus complexes en tapant seulement quelques lignes ! C'est que le shell d'Unix n'est pas un pur et simple interpréteur de commandes, comme le DOS de Windows, mais un véritable environnement de programmation complet.
Cela ne veut pas dire pour autant qu'il vous sera facile d'apprendre à tracer votre propre chemin dans le shell. Après tout il s'agit bien d'apprendre quelque chose, non? ;-) Mais croyez-moi, vous pourrez en être largement récompensés. Et en matière d'Unix la plupart des béotiens vous considèreront bientôt comme un véritable magicien, :-)
Pour arriver à avoir une idée un tant soit peu précise de ce qu'est un interpréteur de commandes - un shell - quelques notions préliminaires ne seront pas inutiles...
[modifier] Vocabulaire et histoire : les terminaux, les xterms et les shells
A l'époque où Unix a fait son apparition, la race maintenant dominante des « ordinateurs personnels » était complètement inconnue. Les machines qu'on appelait alors « ordinateurs » étaient de grosses brutes qui utilisaient des bandes et des mémoires magnétiques (d'où le terme de « coeur » (core) pour désigner la mémoire du système). Avec le PDP-11 de DEC (devenu ensuite Compaq), sorti en 1970, un ordinateur « petit » (d'où le terme « mini ») et relativement bon marché était désormais disponible et il fit rapidement un tabac dans les universités, dont la plupart pouvaient alors pour la première fois faire l'acquisition d'un ordinateur (le PDP-11 était une véritable affaire à seulement 10 000 dollars...).
Les systèmes d'exploitation destinés à ces ordinateurs étaient écrits en assembleur, un langage très lié à la machine et qui de ce fait était très efficace mais aussi radicalement non portable. Chaque fournisseur d'ordinateur vendait son système d'exploitation avec ses machines. On comprit vite ce qu'une telle situation avait d'insatisfaisant et il y eut des tentatives de créer un système d'exploitation qui pourrait tourner sur des ordinateurs de marques différentes. En 1969, Ken Thompson écrivit le premier code de ce qui allait devenir « Unix » (un jeu de mots sur le nom du projet « MULTICS» , sur lequel Thompson avait travaillé auparavant). Les choses démarrèrent vraiment, cependant, lorsque Dennis Ritchie créa un langage pour ce nouveau système d'exploitation, le langage C. Unix était certes moins efficace qu'un système d'exploitation fourni avec la machine par le fabricant, mais il présentait trois avantages décisifs : il pouvait être porté sur n'importe quelle machine que vous vous trouviez avoir sous la main, le langage C qu'il incluait en rendait la programmation infiniment plus aisée et enfin il était « free ». NdTrad: Apparemment ce premier Unix était vendu pour un prix symbolique et distribué sous forme de code source modifiable par le client. Très vite les universités de toute l'Amérique commencèrent à équiper leurs machines de systèmes Unix.
[modifier] Les terminaux
Unix était donc (et est toujours) un système d'exploitation capable de tourner sur une vaste gamme de machines diverses. Que dire de ceux qui utilisaient ces machines ? Eh bien, ils s'y connectaient par l'entremise de terminaux « passifs », c'est-à-dire de machines constituées d'un clavier, d'un moniteur et de ce qu'il fallait d'électronique pour entretenir une connexion avec l'ordinateur central. Ce que les utilisateurs de ces machines faisaient, c'était fondamentalement de la transmission par TéléTYpe, d'où la chaîne de caractères tty pour le nom des fichiers spéciaux des terminaux ou encore le nom de la commande getty.
Vous vous demandez sans doute ce que tout cela a à voir avec notre sujet ! Eh bien, il se trouve que les fournisseurs de ces terminaux ne parvenaient pas à se mettre d'accord sur un standard. Autrement dit, chaque marque de terminal avait sa propre disposition du clavier, sa propre méthode d'affichage des caractères à l'écran, ses propres idées sur la correspondance entre les signaux émis et reçus et les caractères ou les codes de contrôle etc. Afin de venir à bout de ce chaos, un fichier central qui contenait les propriétés différentes des différents terminaux fut créé : le termcap. Ouvrez donc /etc/termcap dans un logiciel capable d'afficher un fichier texte et admirez… ou tremblez… ;-)).
Le type de terminal utilisé le plus souvent sous Linux est vt100 ou linux.
Sous Mandriva, vous pouvez accéder à des consoles qui émulent des terminaux à l'ancienne grâce aux séquences de touches du clavier <CTRL-ALT-F1> à <CTRL-ALT-F6>. ALT+F7 vous ramènera à votre session X (voir ci-dessous). Pour ceux qui aiment regarder sous le capot : elles correspondent aux fichiers spéciaux /dev/tty1 à /dev/tty6… Bien que la terminologie en français ne soit pas rigoureusement fixée, on appelle souvent ces consoles : « consoles tty » ou « consoles texte ».
[modifier] Les xterms
Au début des années 80, fut développé le sous-système graphique « X Window » pour Unix. Le projet XFree86 se détacha de ce système au début des années 90 avec l'objectif d'écrire une version qui serait plus stable lorsqu'elle tournerait sur les clones d'Unix alors émergents basés sur Intel : FreeBSD, NetBSD ou Linux.
Plus récemment le projet « X.org » s'est détaché de XFree86. C'est maintenant l'interface graphique par défaut de Mandriva, depuis la 10.1.
X servait avant tout à exécuter et prendre en charge une multiplicité de terminaux « virtuels ». X comportait même une application dédiée à cela : « xterm ». C'est pour cette raison que, comme vous pourrez le constater, « xterm » et « terminal virtuel » sont souvent pris comme synonymes. Si l'on vous dit : « ouvrez un xterm », il ne vous est pas vraiment nécessaire d'installer et d'utiliser le programme « xterm », n'importe quel autre émulateur de terminal, comme rxvt, konsole, aterm, eterm, wterm etc. pourra faire l'affaire.
Un émulateur de terminal (autre synonyme de « terminal virtuel ») se connecte au système par l'entremise d'un pseudo fichier tty et il utilise son propre standard d'affichage. Cela peut conduire à un comportement légèrement différent de certaines touches ou de certaines applications sur des émulateurs de terminal différents, en fonction de la plus ou moins bonne émulation du standard « xterm » par ces émulateurs.
Sous Mandriva, vous pouvez par exemple accéder à de tels émulateurs en passant par le Menu K de KDE et en faisant : Système /Terminaux (vous pourrez alors choisir entre différents utilitaires : Konsole, rXVT, Gnome Terminal etc. l'inventaire varie selon votre interface graphique). Bien que, là encore la terminologie en français ne soit pas rigoureusement fixée, on appelle souvent ce genre de consoles des « consoles graphiques » (par opposition aux « consoles texte » évoquées à le section précédente).
Toujours pour ceux qui aiment soulever le capot : ces consoles-là sont représentées par des fichiers spéciaux du répertoire /dev dont le nom est un numéro dans le sous-répertoire /dev/pts (/dev/pts/1, /dev/pts/2 etc.) [« pts » pour « Pseudo-TerminalS » = pseudo-terminaux].
[modifier] Les shells
Pour exécuter des programmes sur un terminal, on a besoin d'un shell. Le shell est la partie d'un système d'exploitation qui communique avec l'utilisateur et permet aussi la communication entre les commandes.
Le premier « véritable » shell Unix, sh, a été écrit vers 1975 par Steve Bourne et il est connu, de ce fait, sous l'appellation shell Bourne. Rapidement d'autres shells furent développés, certains fondés sur le shell Bourne originel. Parmi ces derniers on trouve par exemple (pd)ksh ou zsh - souvent utilisés comme shell standard sur les Unix propriétaires - ou encore csh ou tcsh, qui implémentent aussi des caractéristiques du langage de programmation C. NdTrad : 'pd'= 'public domain' = domaine public.
Pour Linux le shell standard est le shell Bash, autrement dit le GNU Bourne-Again Shell (eh oui, de l'humour Unix....). NdTrad : Jeu de mots sur « Bourne again » = « encore Bourne » vs « born again » = « qui a connu une "renaissance" ».
Il est très puissant (certains mauvais esprits diraient même : carrément surchargé), la page de man qui le concerne, après compression (!), pèse quelque 50 Ko.
[modifier] Premiers pas dans le shell
Avant tout une petite remarque : on ne doit jamais utiliser le shell en tant que superutilisateur (root) pour effectuer des tâches courantes, et tout particulièrement quand on débute. Lorsqu'on travaille en tant que simple utilisateur, on ne peut pas endommager le système accidentellement (ou même intentionnellement) ; en tant que root au contraire une simple faute de frappe peut avoir des conséquences graves imprévues.
[modifier] L'invite
La première chose qu'on voit après s'être identifié dans une console texte ou après avoir ouvert, dans une fenêtre, une console graphique, est l'invite. L'invite standard, sur Mandriva, comprend votre nom d'utilisateur, le nom de la machine sur laquelle vous vous êtes identifié (par défaut : localhost), le répertoire où vous vous trouvez (le « répertoire de travail ») et le symbole de l'invite :
[julie@paradis ~]$
Je me suis identifié comme étant l'utilisateur julie sur la machine que j'utilise, machine à laquelle j'ai donné le nom de paradis, et je suis dans mon répertoire personnel : /home/julie. Le caractère ~ est une abréviation pour « le répertoire personnel de l'utilisateur actuel », abréviation utile car il s'agit d'un répertoire fréquemment utilisé par l'utilisateur, ici ~ représente donc /home/julie.
L'invite de root se présente ainsi :
[root@paradis ~]#
On voit qu'en plus de la différence de nom, le symbole de l'invite est passé de $ à #. C'est une tradition des shells Bourne que de terminer l'invite de l'utilisateur ordinaire par $ et l'invite du root par #. Noter que ~ est maintenant une abréviation pour le répertoire personnel de root et donc qu'il ne s'agit pas du même répertoire que précédemment, même si c'est le même caractère qui le représente.
[modifier] Lancer une commande...
Pour exécuter une commande, on tape le nom de la commande après l'invite et ensuite on frappe la touche <ENTREE>. Le shell cherche la commande dans son chemin de recherche (nous reparlerons plus loin de cette notion), exécute la commande, affiche la sortie de la commande (s'il y en a une) sur le terminal et affiche une nouvelle invite lorsque l'exécution de la commande est terminée. Dans l'exemple qui suit, l'utilisateur a tapé la commande whoami (littéralement : quisuisje), pressé la touche <ENTREE> et la machine a répondu - correctement - en donnant le nom de l'utilisateur julie :
[julie@paradis julie]$ whoami julie [julie@paradis julie]$
Tous les aspects de l'invite sont personnalisables, comme on le verra plus bas. Notez que, dans l'exemple qui précède, le répertoire personnel de julie est représenté par julie et non par ~ : les deux styles d'invite sont possibles, c'est affaire de choix personnel...
A noter que la position du curseur au moment où l'on tape <ENTREE> est sans importance, le shell lira toujours de toute façon la ligne complète. Inutile donc, pour lancer l'exécution de la commande, d'aller laborieusement en fin de ligne, à la manière de ce qu'on ferait avant de presser <ENTREE> dans un traitement de texte!! Retenez-le bien.
Parmi les commandes de base figurent : ls (lister le contenu d'un répertoire), cd (changer de répertoire), cp (copier un fichier ou un répertoire), mv (déplacer/renommer). Chacune de ces commandes est dotée d'un grand nombre d'options, énumérées dans leurs pages de man respectives (man ls, man mv etc.). Nous donnerons bientôt quelques indications qui vous permettront de commencer à les utiliser.
Lorsque vous pressez sur le clavier la touche <TAB> (« tabulation » = touche généralement située en haut et à gauche du clavier et sur laquelle sont d'ordinaire dessinées deux flèches), vous obtenez à l'affichage une liste des commandes disponibles et si vous pressez <TAB> après avoir tapé quelques caractères, vous obtenez la liste des commandes disponibles dont le nom commence par ces caractères. NdTrad : Cette technique, qui permet d'économiser la frappe, sera davantage expliquée plus loin et est connue sous l'appellation de « (auto-)complétement » (ou « complétion ») de la ligne de commande.
[modifier] Les serviteurs de la commande : options et arguments...
Avant d'entrer dans le pays du shell, voici une brève introduction terminologique.
Les commandes prennent des options et/ou des arguments. Ainsi dans :
mv -i fichier dir
-i est une option de la commande mv, tandis que fichier et dir sont des arguments de cette commande. Les options disponibles sont décrites en détail dans la page de man de la commande (man mv dans ce cas-ci) et les arguments sont fournis par l'utilisateur. Les options modifient la façon dont la commande travaille, tandis que les arguments déterminent sur quelles données la commande doit être exécutée.
[modifier] Options courtes et options longues
Comme vous aurez très souvent l'occasion de le constater, certaines options ne contiennent qu'une seule lettre, ce sont des options « courtes ». Elles sont en général précédées par un seul tiret, comme dans l'exemple ci-dessus. Deux options de ce genre (par exemple pour mv : l'option -i et l'option -v) peuvent être regroupées derrière un même tiret, ce qui donnerait : mv -iv fichier dir.
D'autres options contiennent plusieurs caractères, ce sont des options « longues ». Elles doivent alors - en général du moins - être chacune précédées de deux tirets. Pour obtenir une (petite) aide sur mv vous pourriez utiliser, par exemple, l'option --help et faire : mv --help.
Quelques rares commandes sont « autorisées » à posséder des options courtes sans tiret… (par exemple, les commandes ps et top dont nous dirons un mot à la page suivante ou encore la commande tar - pour une description de cette dernière commande, voir ici et pour un exemple d'emploi de tar parmi d'autres voir (futur lien) là).
Jusqu'à présent, tout cela ressemble fort au shell DOS que presque tout le monde déteste et méprise (et à juste titre). C'est donc le moment d'introduire des mécanismes qui feront de votre vie avec le shell une expérience bien plus agréable.
[modifier] Les toutes premières commandes du shell à expérimenter
[modifier] Introduction
Si vous êtes débutant, la première chose à faire avant de poursuivre cette lecture devrait être de vous essayer un peu à la manipulation de quelques commandes simples. C'est ce à quoi cette section sera consacrée. Jouez donc, dans une console, avec ces premières commandes, dont nous donnons ici un premier aperçu rapide, pour commencer à vous entraîner un peu... Prenez tout votre temps... faites par vous-même vos premiers petits essais...
Pour ouvrir une console :
- ou bien vous pressez simultanément les touches Alt+Ctrl+Fn (avec n entre 1 et 6), ce qui vous amènera à une console texte : vous pourrez revenir ensuite à votre environnement graphique habituel par la combinaison de touches Alt+F7
- ou bien vous faites, pour accéder à un terminal graphique, sous KDE, Menu K -> Système -> Terminaux et vous choisissez par exemple Konsole (on accède au Menu K en cliquant sur l'étoile jaune de la barre des tâches) ou bien vous faites l'équivalent sous GNOME ou sous une autre interface graphique.
Attention, ne jouez pas en étant connecté sous root mais uniquement sous votre identité de simple utilisateur.
[modifier] Pour savoir « où vous êtes au juste »
- La commande :
pwd
permet d'afficher le nom du répertoire de travail (parfois appelé aussi répertoire courant).
Pour mémoriser plus facilement : 'pwd' est l'acronyme de l'anglais Print Working Directory = afficher le répertoire de travail.
[modifier] Pour créer un fichier vide
- La commande :
touch nom_de_fichier
crée un fichier vide appelé nom_de_fichier.
Si d'aventure le fichier nom_de_fichier existe déjà, seul son horodatage (date et heure du fichier) sera modifié, le contenu restant intact.
Vous pouvez créer plusieurs fichiers d'un seul coup :
touch a b c
créerait trois fichiers nommés a, b et c.
[modifier] Pour ajouter une ligne à la fin d'un fichier sans supprimer son contenu antérieur
- Une combinaison de la commande echo et de l'opérateur de redirection >> fera l'affaire :
echo "bla bla bla" >> nom_de_fichier
La dernière ligne du fichier nom_de_fichier contient maintenant le texte « bla bla bla »...
[modifier] Pour lire le contenu d'un fichier texte
- La commande
cat nom_de_fichier
permet d'afficher le contenu du fichier texte nom_de_fichier.
[modifier] Pour écrire plusieurs lignes dans un fichier
Pour écrire dans un fichier, ligne par ligne, directement dans la console, sans ouvrir d'éditeur de texte, vous pouvez faire ceci :
cat > choin.txt
ensuite vous tapez le contenu des lignes successives (pour passer à la ligne suivante taper <ENTREE>) et quand vous avez fini faites <Ctrl-d>. Toutes les lignes devraient maintenant être visibles dans le fichier choin.txt (faites cat choin.txt pour le vérifier).
[modifier] Pour remplacer le contenu d'un fichier existant par un autre contenu ou créer un fichier doté d'un contenu défini
- Analogue à l'avant-dernière commande mais en utilisant cette fois l'opérateur de redirection > :
echo "bla bla bla" > nom_de_fichier
Le fichier nom_de_fichier a maintenant un contenu qui se réduit à une ligne « bla bla bla ». Tout éventuel contenu antérieur a disparu. (Si le fichier n'existait pas avant exécution de la commande, il sera directement créé, sans que vous ayez à passer par la commande touch).
[modifier] Pour lire le contenu d'un fichier texte s'étendant sur plusieurs pages
- La commande :
less nom_de_fichier
permet d'afficher le contenu d'un fichier et de se déplacer dedans.
[modifier] Pour changer le nom d'un fichier ou d'un répertoire
- La commande :
mv nom1 nom2
permet de renommer le fichier ou répertoire nom1 en nom2.
[modifier] Pour créer un nouvel exemplaire d'un fichier
- La commande
cp fichier1 fichier2
permet de créer fichier2 en copiant le contenu du fichier1 (au bout du compte vous retrouvez avec les deux fichiers fichier1 et fichier2, dont les contenus sont identiques et les noms différents...). Pour plus de détails sur la commande cp, voir Copie de fichiers ou de répertoires.
[modifier] Pour voir ce qui se trouve dans un répertoire
- La commande :
ls
permet de lister le contenu du répertoire de travail.
- La commande :
ls -l
permet de lister le contenu du répertoire de travail en affichant diverses propriétés pour chaque élément de la liste.
- Les commandes :
ls -a
ou
ls -la
permettent de lister le contenu du répertoire de travail en incluant les fichiers cachés.
- La commande :
ls -l repertoire
permet de lister le contenu du répertoire repertoire.
Pour plus de détails voir l'ensemble de la page sur La commande ls.
[modifier] Pour aller voir ailleurs
- La commande :
cd répertoire
permet de changer de répertoire de travail.
- La commande :
cd
employée seule, sans argument, vous ramène dans votre répertoire personnel.
- La commande :
cd -
vous ramène au répertoire de travail précédent.
- Enfin :
cd ..
vous fera sauter une branche de l'arborescence du système de fichiers en vous amenant au répertoire « parent » de votre répertoire de travail actuel.
[modifier] Pour nettoyer
- La commande
rm fichier
permet de supprimer un fichier.
Vous pouvez supprimer d'un seul coup plusieurs fichiers :
rm a b c
supprimerait trois fichiers existants nommés a, b et c.
Attention les fichiers effacés seront irrémédiablement perdus (à moins que vous n'ayez pris (futur lien) ces précautions).
[modifier] Pour créer ou supprimer des répertoires
- La commande
mkdir répertoirepermet de créer un répertoire.
Si voulez créer un répertoire et en même temps un ou plusieurs sous-répertoires nouveaux qui le contiendront vous devez utiliser l'option -p
mkdir -p rep1/rep2/répertoire
créera non seulement répertoire, mais aussi rep1 et rep2, au cas où ils n'existeraient pas.
- La commande :
rmdir répertoire
permet de supprimer un répertoire vide.
Et si je veux effacer un répertoire « plein » ? Eh bien, il vous faudra utiliser alors la commande rm avec des options :
rm -r répertoire/
effacera répertoire et tout son contenu, en vous demandant la permission avant tout effacement et
rm -rf répertoire/
effacera tout sans rien vous demander...
Attention : après exécution de ces commandes ce qui aura été effacé sera irrémédiablement perdu !! (sauf si vous avez pris ces précautions).
[modifier] Pour ranger un fichier ailleurs
- La commande
mv fichier répertoire
vous permettra de déplacer le fichier fichier vers le répertoire répertoire.
[modifier] Pour chercher du texte dans un fichier
- La commande
grep chaine_à_chercher nom_de_fichier
permet de rechercher une chaine de caractères dans un fichier. Voir, sur cette commande : Faire une recherche dans des fichiers texte avec grep.
- La commande
grep -i chaine_à_chercher nom_de_fichier
permet la même chose mais sans distinguer entre majuscules et minuscules (si chaine_à_chercher est iso vous trouverez aussi bien iso que ISO ou même Iso, s'ils figurent dans le fichier, alors qu'avec la version précédente vous n'auriez obtenu que iso).
[modifier] Pour savoir ce qui se passe chez vous
- La commande
top
permet de lister les programmes qui utilisent le plus votre processeur (ils seront en haut de l'affichage). A noter : pour quitter top, il suffit de presser la touche q.
- La commande
ps ux
permet de lister tous les programmes actifs de l'utilisateur courant.
- La commande
ps aux
permet de lister tous les programmes actifs du système.
[modifier] Pour revoir ce que vous avez fait
- Faites défiler les commandes que vous avez tapées précédemment à l'aide des touches Flèche vers le haut et Flèche vers le bas.
- La commande
historypermet de visualiser la liste des dernières commandes utilisées.
[modifier] Pour devenir administrateur et revenir bien vite sous votre identité
- La commande
su -
permet de passer en mode administrateur, c'est-à-dire permet de devenir root (attention ne restez pas sous root pour expérimenter toutes ces commandes, une erreur est si vite arrivée !).
- La commande
exit
vous permet de revenir à votre identité antérieure.
[modifier] J'ai oublié à quoi sert la commande machin !!
Dans ce cas la commande :
whatis
vous en donnera une brève définition (en anglais). Essayez-la donc, pour voir, avec les quelques commandes de cette page. (Vous pouvez même tenter whatis whatis...).
[modifier] J'ai oublié le nom d'une commande !!
Vous avez l'impression de n'avoir mémorisé qu'une partie du nom d'une certaine commande et vous ne parvenez pas à reconstituer le nom complet ?
Essayez la commande apropos, en lui fournissant en argument un fragment du nom de la commande que vous cherchez...
Par exemple, si vous avez oublié le nom exact de cette commande qui vous permet d'obtenir une liste de vos périphériques pci, vous pourrez retrouver son nom (lspci) en tapant :
apropos pci
[modifier] Divers outils pour se rendre la vie plus facile dans le monde de la console
[modifier] Introduction
Unix (et son jeune frère Linux) sont nés au fil de la ligne de commande. Aussi la ligne de commande d'Unix présente-t-elle de nombreux mécanismes destinés à vous éviter des tâches de dactylographie ancillaires. Cette section est une introduction à ce genre de mécanismes.
[modifier] L'auto-complétement
Comment passer le plus rapidement possible de votre répertoire de travail courant, situé dans votre répertoire personnel, au répertoire :
/usr/src/linux/Documentation/isdn/
en utilisant la commande cd (« changer de répertoire ») ?
Eh bien, voilà, il vous suffit de taper ceci (où <TAB> représente une pression sur la touche des tabulations, aussi appelée touche <ECHAP>, une touche d'ordinaire située en haut à gauche de votre clavier et qui comporte le plus souvent deux flèches horizontales) :
cd /u<TAB>sr<TAB>l<TAB>/<TAB>D<TAB>isd<TAB>
Au total vous pressez 16 touches du clavier pour un « chemin » qui comporte 34 caractères !! 53 % d'économie en « frappe » du clavier !!
C'est ce qu'on appelle « le complétement (ou la complétion) automatique de la ligne de commande », quelque chose de tout à fait indispensable. Regardons de plus près notre exemple :
cd /u<TAB>
devient cd /usr/. Facile. Ensuite
cd /u<TAB>sr<TAB>
devient cd /usr/src/. Si vous tapez cd /u<TAB>s<TAB>, le shell vous présente une liste de trois répertoires de /usr : /usr/sbin, /usr/share et /usr/src.
La touche <TAB> est donc un moyen pratique de rechercher dans un répertoire des fichiers ou des sous-répertoires dont vous connaissez les premières lettres. Ainsi ls /usr/bin/zip<TAB> fournit une liste de tous les fichiers ou sous-répertoires de /usr/bin dont les noms commencent par les lettres 'zip'. Il y a bien sûr des commandes beaucoup plus puissantes qui peuvent aussi effectuer cette tâche, mais le complétement règle l'affaire en un tournemain.
C'est vraiment très pratique avec des noms de fichier très longs. Imaginons que vous vouliez installer un RPM appellé 'boomshakalakwhizbang-4.6.4.5-mdk586.rpm'. Vous tapez rpm -i boom<TAB> et, s'il n'y a pas d'autre fichier qui corresponde dans le répertoire, le shell complètera la suite tout seul.
Si vous tapez :
cd /u<TAB>sr<TAB>l<TAB>
le shell vous propose, par exemple, trois choix et attend que vous preniez une décision. Il y a en effet, dans votre système, deux répertoires de /usr/src qui correspondent à : '/usr/src/linux-{...}' et il y a aussi /usr/src/linux lui-même. Comment dire au shell que c'est le deuxième cas qui nous intéresse ? Ajoutez une barre oblique ('/'), vous représentez ainsi la fin de ce deuxième nom (ceci est vrai pour la fin d'un nom de répertoire uniquement).
Le complétement ne permet pas seulement d'aller plus vite : il permet aussi de retrouver des informations ou de s'assurer qu'on ne se trompe pas en tapant tel ou tel nom.
Imaginons par exemple que vous ne sachiez plus très bien si le répertoire que vous cherchez est /usr/src/linux/Documentation ou /usr/src/linux/documentation. Comme vous le savez peut-être, Linux différencie les majuscules des minuscules. Si vous avez lu attentivement ce qui précède, vous connaissez déjà la réponse :
cd /u<TAB>sr<TAB>l<TAB>/d<TAB>
devient /usr/src/linux/drivers/. Selon toute apparence c'était donc 'Documentation' (avec un 'D' majuscule).
La complétion est donc aussi un dispositif de sécurité : n'hésitez pas à l'employer même si vous tapez vite et si vous croyez vous souvenir des noms des fichiers et répertoires qui vous intéressent. Cela constituera une utile vérification.
La complétion marche aussi avec les commandes :
[julie@paradis ~]$ gre<TAB> grecord grefer grep [julie@paradis ~]$ grep
Le shell me propose ici une liste de toutes les commandes qu'il connaît dont le nom commence par la chaîne de caractères gre. Un mécanisme qui peut vous aider si vous avez oublié le nom exact de la commande. Notez que si vous tapez <TAB> en début de ligne sans avoir rien tapé d'autre le shell vous proposera d'afficher la totalité des commandes que vous avez le droit de lancer sur le système !
Au total la complétion vous permet :
- de taper plus vite
- d'éviter des erreurs
- de retrouver des informations oubliées.
[modifier] Le paquet bash-completion
Si vous utilisez le shell bash (par défaut avec Mandriva), le paquet bash-completion ajoute la complétion avec des règles prédéfinies.
Par exemple, si vous faites :
$ perl <TAB>
C'est probablement que vous souhaitez exécuter un script perl. Bash-completion va alors ne vous proposer que les fichiers finissant par .pl du répertoire courant. (À vérifier : est-ce qu'il se base sur le nom (.pl) où sur le type de fichier (en utilisant la commande file) ?)
Ce comportement peut être outrepassé ponctuellement en utilisant Alt-/ à la place de Tab.
[modifier] L'historique des commandes
Avec la touche « flèche vers le haut » vous pouvez faire défiler toutes les commandes du shell que vous avez lancées récemment sur la console. Avec la touche « flèche vers le bas » vous pouvez revenir en arrière.
En appuyant en même temps sur la touche MAJ, vous pouvez faire défiler les précédentes sorties vers la console. Par exemple, on a vu plus haut qu'on peut afficher l'ensemble des commandes avec la touche <TAB>, il peut arriver qu'il y en ait beaucoup trop pour qu'elles tiennent toutes sur un seul écran et elles défilent alors à toute vitesse, vous pouvez dans ce cas les revoir tranquillement en appuyant sur MAJ et en manipulant en même temps la flèche <Haut> et la flèche <Bas>. Vous pouvez aussi éditer de « vieilles » lignes de commande et les lancer à nouveau. Nota : Cette fonctionnalité est disponible, dans mon système, sous l'utilitaire Konsole de KDE, mais peut faire défaut dans d'autres environnements.
La combinaison de touches <CTRL r> place le shell dans le mode « recherche incrémentale inversée » (reverse-i(ncremental)-search). Vous obtenez alors ceci :
(reverse-i-search)`':
Vous pouvez alors, par exemple, taper la première lettre de la commande que vous recherchez. Taper 'i' peut aboutir à ceci :
(reverse-i-search)`i': isdnctrl hangup ippp0
si la dernière commande commençant par 'i' que vous avez lancée est isdnctrl hangup ippp0.
En appuyant sur <ENTREE>, cette commande sera à nouveau exécutée. Les touches<Droite> ou <Gauche> ou <ECHAP>, placeront cette commande sur la ligne de commande normale où vous pourrez l'éditer.
Note : La recherche lancée par <CTRL r> est dite « inversée » parce que le shell vous donne d'abord la ligne de commande la plus récente, puis chaque fois que vous taperez à nouveau <CTRL r>, il vous donnera une ligne plus ancienne. La recherche est « incrémentale » parce qu'au fur et à mesure que vous tapez les caractères d'une chaîne, le shell vous affiche une ligne de commande qui contient les caractères déjà tapés. |
Notez que si vous êtes allé très loin en arrière en faisant plusieurs fois <CTRL r>, vous pouvez relancer une recherche en sens inverse, en direction des commandes plus récentes, par la combinaison de touches <CTRL s>.
Pour plus d'astuces sur l'utilisation de l'historique, voir L'historique du shell.
[modifier] Editer la ligne de commande
Pour éditer la ligne de commande on peut déplacer le curseur à l'aide des touches de fonction habituelles (touche <Début>, touche <Fin>, flèches <Gauche> et <Droite>, touches <Retour arrière> et <Suppr> pour effacer un caractère), mais l'on dispose aussi de raccourcis clavier pour la plupart des tâches d'édition courantes :
- Effacement de ligne
- <CTRL k> : effacement depuis la position du curseur incluse jusqu'à la fin de la ligne (k pour kill = tuer en anglais)
- <CTRL u> : effacement depuis le caractère qui précède le curseur jusqu'au début de la ligne
- Effacement de mot
- <ALT d> : effacement depuis la position du curseur incluse jusqu'à la fin du « mot » courant
- <CTRL w> : effacement depuis le caractère qui précède le curseur jusqu'au début du « mot » courant
- Déplacement en début et fin de ligne
- <CTRL a> : placer le curseur sur le premier caractère de la ligne (comme la touche <Home>/<Début>)
- <CTRL e> : placer le curseur après le dernier caractère de la ligne (comme la touche <End>/<Fin>)
- Se déplacer de mot en mot
- <ALT b> : placer le curseur sur le premier caractère du « mot » courant (b comme begin = commencer en anglais)
- <ALT f> : placer le curseur après la fin du « mot » courant (f comme follow = suivre en anglais)
- Insérer ce qui a été effacé
- <CTRL y> : insère la dernière chaîne de caractères de la ligne de commande effacée par l'une des commandes précédentes
- Récupérer un argument de la ligne précédente
- !$ : reprise du dernier argument de la commande précédente.
Exemple: créons un répertoire avec :
mkdir -p peter/pan/documents/clochettes
Nous voulons maintenant entrer dans ce répertoire en utilisant la commande cd. Au lieu de retaper le chemin, nous tapons simplement :
cd !$
et le shell va donner comme argument à la commande cd le chemin peter/pan/documents/clochettes qui servait d'argument à la commande mkdir précédente.
- Effacer ou se déplacer caractère par caractère (utile pour garder ses mains bien au milieu du clavier...)
- <CTRL d> : effacement du caractère sous le curseur (comme la touche <Suppr>)
- <CTRL b> : se déplacer d'un caractère vers la gauche (comme la flèche <Gauche>)
- <CTRL f> : se déplacer d'un caractère vers la droite (comme la flèche <Droite>)
- Tout nettoyer
- <CTRL l> : efface le contenu de l'écran
A mesure que vous vous familiariserez avec Linux, vous vous apercevrez que ces raccourcis clavier sont aussi utilisés dans d'autres applications pour entrer du texte. Une bonne part d'entre elles sont également utilisées dans le célèbre éditeur de texte Emacs. Elles sont aussi disponibles dans les pages de la documentation à laquelle on accède par (futur lien) la commande info.
Par défaut les raccourcis d'édition de la ligne de commande du shell Bash sont identiques aux raccourcis par défaut d'Emacs. Toutefois si vous êtes, ou devenez un jour, un aficionado de l'éditeur de texte vim (ou de son ancêtre vi), vous pourrez faire en sorte que Bash utilise plutôt les raccourcis de ce dernier logiciel. Si c'est ce que vous souhaitez, vous lancerez la commande suivante :
set -o vi
pour la pérenniser vous l'écrirez dans votre fichier de configuration ~/.bashrc.
[modifier] Les raccourcis clavier du shell
Mandriva Linux est doté de toute une gamme de raccourcis, certains sont des traits « natifs » de Bash, d'autres ont été préconfigurés (vous apprendrez par la suite à configurer vos propres raccourcis).
Le répertoire personnel est le point central de l'activité de tout utilisateur et nombre de systèmes Unix possèdent des raccourcis particuliers pour y faire référence.
~, par exemple, est une forme courte du nom de votre répertoire personnel. Supposons que vous soyez dans quelque répertoire éloigné et que vous souhaitiez copier un fichier appelé untexte dans le répertoire docs de votre répertoire personnel. Au lieu de taper (si votre nom d'utilsateur est julie) :
cp untexte /home/julie/docs
vous taperez simplement :
cp untexte ~/docs
ce qui est beaucoup plus court tout en ayant exactement le même effet.
En principe, ceci peut être appliqué aussi à la commande cd.
cd ~
vous conduirait à votre répertoire personnel, où que vous soyez. Mais même cela est encore trop ! Taper simplement :
cd
et vous serez de retour dans votre répertoire personnel.
Mandriva Linux vous fait bénéficier d'un ensemble de raccourcis pré-configurés (appelés alias) :
- cd..
exécute cd .. (aller dans le répertoire parent, utile au cas où vous auriez oublié de taper l'espace qui doit séparer cd de ..).
- d
exécute ls (liste du contenu d'un répertoire).
- l
exécute ls (liste du contenu d'un répertoire).
- la
exécute ls -a (liste complète du contenu d'un répertoire, incluant les fichiers « cachés », dont les noms commencent par un point)
- ll
exécute ls -l -k (liste du contenu d'un répertoire en format long, c'est-à-dire avec des attributs de fichiers, avec affichage de la taille des fichiers en Ko, et non en octets)
- ls
exécute ls -F --color=auto (liste du contenu d'un répertoire, avec des indicateurs de types de fichiers et une utilisation de la couleur)
- lsd
exécute ls -d */ (liste des sous-répertoires uniquement, sans les fichiers)
- md
exécute mkdir (créer un répertoire)
- p
exécute cd - (retourner dans le répertoire précédent)
- rd
exécute rmdir (effacer un répertoire (vide))
- s
exécute cd .. (aller dans le répertoire parent)
Maintenant que vous êtes un peu familiarisé avec le shell et certains de ses raccourcis, il est temps de jeter un coup d'œil sur ce que l'on peut vraiment faire avec son aide au-delà de l'exécution de simples commandes.
[modifier] Enchaînement de commandes
Vous vous rendrez compte peu à peu que certaines combinaisons de commandes sont particulièrement fréquentes. Vous pourriez alors avoir envie de lancer toutes ces commandes sur une seule ligne et de penser à autre chose. Pas de problème. Le shell vous permet de placer à cet effet divers symboles spéciaux entre les commandes. Cette sous-section présente les deux plus importants. Vous pourrez remarquer, dans ce qui suit, que je place des espaces autour de ces symboles par souci de lisibilité. Ils ne sont cependant pas nécessaires en pratique : il n'y a aucune différence par exemple entre ls -a ; du -hs et ls -a;du -hs.
[modifier] Le point-virgule
commande1 ; commande2
exécute commande1 d'abord, puis commande2, même si commande1 a renvoyé un code d'erreur. Exemple :
ls -a ; du -hs
affichera d'abord à l'écran une liste complète du contenu du répertoire courant et ensuite l'espace total occupé par les fichiers de ce répertoire et de ses sous-répertoires.
[modifier] Le &&
commande1 && commande2
exécute commande2 si et seulement si commande1 s'est achevée sans erreur. Exemple :
ls -a dirbidon && du -hs
renverra
ls: dirbidon: No such file or directory
et du ne sera absolument pas exécuté (en supposant bien sûr que vous n'avez pas sur votre disque de répertoire dirbidon ;-)). Si vous aviez utilisé ; au lieu de &&, la commande du aurait été exécutée.
L'exemple classique qui sert à mettre en évidence la différence entre ; et &&, et l'utilité de l'enchaînement de commandes est la compilation et l'installation du noyau de Linux. Pour compiler et installer le noyau de Linux, on doit exécuter un ensemble de commandes les unes après les autres : make dep, make clean, make bzImage, make modules, make modules_install et make install. Il serait bien ennuyeux de lancer une de ces commandes, puis d'attendre que son exécution s'achève, lancer la commande suivante, attendre à nouveau, lancer la suivante etc. D'un autre côté chacune des commandes de cette série ne marchera correctement que si toutes les commandes précédentes ont été exécutées sans erreur. Or si vous avez recours au symbole ; pour enchaîner ces commandes alors si l'une d'entre elles échoue, le reste des commandes sera quand même exécuté, et vous pourriez vous retrouver avec une image du noyau défectueuse dans le répertoire /boot. Vous devez donc utiliser && :
make dep && make clean && make bzImage && make modules && make modules_install && make install
Cette ligne de commande compilera le noyau et ses modules et les installera sans requérir une quelconque interaction avec vous.
[modifier] Exécuter une commande en tâche de fond (à l'arrière-plan)
[modifier] Lancer une commande en tâche de fond
Lorsque vous lancez une commande ou un programme sur un terminal celui-ci reste bloqué tant que cette commande, ou ce programme, est en cours d'exécution. Sous Unix, on dit alors que la commande ou le programme s'exécutent « au premier plan ». Si vous avez alors besoin de lancer une autre commande vous devez ouvrir un autre terminal.
Mais il y une façon plus élégante de s'en sortir : la mise « à l'arrière-plan » (on peut dire aussi : l'exécution en tâche de fond) de la tâche courante (souvent appelée alors un « job »). Lorsque vous mettez une commande (un « job ») à l'arrière-plan, elle abandonne immédiatement le terminal, si bien que celui-ci est tout de suite disponible et que vous pouvez y entrer autre chose. Pour cela tout ce que vous avez à faire est de placer un & après la commande. Par exemple, comme ceci :
unison &
cette commande dit au shell d'exécuter le logiciel de synchronisation et de sauvegarde Unison « à l'arrière-plan » (autrement dit de l'exécuter en tant que « job »).
La commande jobs vous indique quelles commandes et quels programmes sont en train de s'exécuter en tant que jobs sur cette fenêtre de terminal :
jobs [1]+ Running unison &
[modifier] Comment tuer une commande qui s'exécute en tâche de fond
Ceci n'est pas sans importance lorsque vous envisagez de fermer une fenêtre de terminal car, en fermant un terminal, tous les jobs en cours d'exécution qui ont été lancés depuis ce terminal sont interrompus, autrement dit, si vous fermez ce terminal-ci, le programme Unison, qui a été lancé depuis ce terminal, sera arrêté lui aussi.
Attention donc, à l'occasion d'un « nettoyage » de votre interface graphique, à ne pas, d'un clic frénétique et hâtif, fermer la console qui abrite le programme qui tourne en tâche de fond depuis un bon moment en accumulant de précieuses données : les données seraient perdues et tout serait à recommencer...
D'un autre côté, vous pourriez vous dire que fermer le terminal, ou, ce qui revient souvent au même, clore la session du shell par un rapide <Ctrl d>, est un excellent moyen d'arrêter une bonne fois l'ensemble des programmes ouverts à l'arrière-plan. A vrai dire, il est plutôt conseillé de laisser de tels programmes se terminer d'eux-mêmes, d'une mort naturelle, ou s'ils ont ouvert une fenêtre, d'utiliser les outils (boutons...) qui y sont offerts pour fermer le programme de façon « normale ». Toutefois, si aucune fenêtre ne le permet et si vous vous apercevez qu'un programme à l'arrière-plan vous est finalement inutile et consomme des ressources pour rien ou semble carrément planter, vous pouvez l'arrêter « proprement » de façon très simple, en donnant comme argument à la commande kill son « numéro de job », précédé du signe de pourcentage (%) :
kill %numero_de_job
Ainsi, dans notre exemple,
kill %1
terminera proprement Unison.
Si le programme est planté au point de ne pas « mourir » à la suite de cette dernière commande, alors et alors seulement, vous devrez utiliser la commande kill avec le « signal de mort » 9 (signal SIGKILL) et le PID du processus concerné (que vous obtiendrez par la commande top ou ps -aux) :
kill -s 9 PID
[modifier] Comment faire passer une commande de l'avant-plan à l'arrière-plan
Et maintenant, que faire si vous souhaitez placer à l'arrière-plan un programme qui est en cours d'exécution à l'avant-plan ? Rien de plus facile :
unison <CTRL z> [2]+ Stopped unison bg [2]+ unison &
La combinaison de touches <CTRL z> suspend l'exécution de tout programme qui tourne à l'avant-plan sur le terminal, ceci fait, vous pouvez ensuite réactiver le programme suspendu de telle sorte qu'il s'exécute maintenant en toile de fond : il vous suffira pour obtenir ce résultat de lancer la commande bg (la commande fg réactiverait au contraire le programme en le mettant à l'avant-plan).
Notez que, dans certains cas, il peut être utile de faire démarrer une application graphique à l'avant-plan à partir d'un terminal : si vous procédez ainsi, en effet, tous les messages d'erreur éventuels que l'application générera seront affichés sur le terminal et même s'ils ne vous sont pas utiles à vous ils pourront l'être pour la personne que vous appelerez à l'aide si quelque chose ne tourne pas rond !
Certains programmes graphiques cependant, en général pendant leur phase d'essais ou de bêta tests, continuent à envoyer leurs messages vers le terminal qui les contrôle même s'ils ont été placés à arrière-plan. Si ce comportement vous gêne vous pouvez l'éviter en tapant :
commande &>/dev/null &
ce qui a pour effet non seulement de mettre le programme à l'arrière-plan mais aussi d'envoyer toutes les sorties vers le fichier spécial /dev/null. /dev/null est le broyeur de documents du système, tout ce que vous y expédiez disparaît immédiatement sans laisser de trace.
[modifier] Substitution de commande
La substitution de commande est une fonctionnalité très pratique. Supposons que vous souhaitiez jeter un coup d'oeil au fichier DIR_COLORS qui gère l'usage des couleurs affichées en console par la commande ls, mais que vous ne sachiez pas où il se trouve. Comme vous êtes un utilisateur averti, vous avez déjà entendu parler de la commande locate et le package slocate est installé sur votre machine. Vous faites donc un :
locate DIR_COLORS
et vous découvrez que ce fichier se trouve dans /etc/DIR_COLORS. Parvenu à ce point, vous pouvez soit utiliser le visionneur de pages de terminal less soit votre éditeur de fichier habituel pour afficher le fichier en question, en donnant ce chemin comme argument. La substitution de commande facilite grandement tout cela :
less $(locate DIR_COLORS)
permet de réaliser toutes ces opérations en une seule étape. La sortie de la commande locate DIR_COLORS (= /etc/DIR_COLORS) est prise comme argument par le visionneur less, qui affiche alors le fichier.
La syntaxe de ce mécanisme est la suivante :
commande1 $(commande2)
Au lieu de $(), on peut utiliser de simples « accents graves » ou « guillemets simples inversés » (anglais backquotes) :
commande1 `commande2`
C'est économique en termes de frappe mais plus difficile à lire dans un script et plus facile à confondre avec l'emploi « normal » des guillemets simples, que le shell n'accepterait pas comme des indicateurs de substitution de commande. Je préfère pour ma part la première méthode, mais à vous de voir.
Voici un autre exemple. Supposons que vous souhaitiez tuer un stupide programme machin. Vous pouvez le faire en commençant par détecter son (futur lien) identificateur de processus - (PID) à l'aide de la commande pidof puis en lançant la commande kill avec ce PID comme argument. Au lieu de taper :
pidof machin 567 kill 567
tapez plutôt :
kill `pidof machin`
Plus compact, non ? (noter que la commande pidof n'est accessible que sous root).
Dans les sections suivantes, je vais aborder deux autres mécanismes utiles du shell, l'expansion des noms de fichier et la redirection des sorties.
[modifier] L'expansion des noms de fichier
L'expansion des noms de fichier permet de fournir une multiplicité de noms de fichier à une commande sans avoir à les écrire tous en entier. On utilise pour cela des caractères spéciaux, appelés « jokers » ou « méta-caractères ».
[modifier] Le joker *
Si vous voulez par exemple effacer avec la commande rm tous les fichiers d'un répertoire dont les noms se terminent par la chaîne de caractères .bak, alors, au lieu de taper chaque nom de fichier en position d'argument de rm, on utilise le joker * :
rm *.bak
le caractère * correspond à zéro, un ou plusieurs caractères. Dans cet exemple vous dites donc au shell que l'argument de la commande rm est élargi à « tous les fichiers dont les noms se terminent par (ou dont le nom se réduit à) .bak », le shell opère ainsi et passe cet argument élargi à la commande rm.
Comme nous le verrons, il est important de bien comprendre que le shell lit et interprète la ligne de commande avant que la commande elle-même ne le fasse. Ceci présente l'avantage de permettre l'utilisation de jokers avec (presque) toutes celles des commandes du shell qui prennent comme arguments des chaînes de caractères (noms de fichiers, noms de répertoires, motifs faisant l'objet d'une recherche etc.).
Jouons encore un peu avec le joker *. Vous avez par exemple un répertoire qui contient les fichiers 124.bak, 346.bak et 583.bak. Vous voulez faire le ménage et conserver uniquement 583.bak. Vous faites alors simplement ceci :
rm *4*.bak
Le shell élargit l'argument de rm à « tous les noms de fichiers qui contiennent le nombre 4 et qui se terminent par la chaîne de caractères .bak ». Notez que
rm 4*.bak
n'aurait pas marché, puisque cela n'aurait englobé que les noms de fichier qui commencent par le nombre 4. Comme il n'y a pas de fichier de ce genre dans le répertoire, le shell aurait élargi ce type d'argument à… une chaîne nulle et rm aurait renvoyé un message d'erreur :
rm: ne peut évaluer par lstatt() `4*.bak': Aucun fichier ou répertoire de ce type
Si vous voulez garder le fichier 346.bak mais effacer 124.bak et 583.bak, c'est un peu plus délicat car les fichiers à effacer n'ont rien en commun à part la dernière partie de leur nom. Mais, chanceux comme vous l'êtes, vous pouvez aussi définir des fichiers par ce qu'ils ne possèdent pas !
rm *[!6].bak
Cette ligne se lit ainsi : « effacer tous les fichiers qui se terminent par la chaîne de caractères .bak sauf ceux qui se terminent par la chaîne 6.bak ». Il faut mettre entre crochets le signe de négation ! et le caractère sur lequel il porte (ici 6), sinon le shell interprèterait le point d'exclamation comme le début d'une substitution de commande de l'historique des commandes. La négation fonctionne avec tous les types d'expansion de nom de fichier introduits dans cet article. (Note : La commande history affiche une liste numérotée de commandes précédemment appelées, si n est le numéro d'une de ces commandes, alors !n permet de l'exécuter. C'est cela que les crochets permettent d'éviter dans l'exemple qui précède.)
Notez qu'il est très facile de se tirer une balle dans le pied en utilisant le joker * et la négation. Devinez par exemple ce que fait la ligne :
rm *[!6]*.bak
Elle efface tous les fichiers du répertoire dont le nom se termine par .bak, y compris ceux dont le nom contient un 6 ! Si vous placez le joker * après et avant une négation, il rend la négation quasi inutile : ici le shell élargit l'argument de rm à « tous les noms de fichier qui possèdent un caractère différent de 6 dans une position quelconque avant .bak ». Dans notre exemple, parmi les fichiers qui se terminent par .bak seuls seraient épargnés des fichiers dont le nom comporterait uniquement une suite de 6 suivie de .bak, comme 666.bak.
[modifier] Le joker ?
Le second joker est le point d'interrogation : ?.
Pour l'expansion de noms de fichier, le point d'interrogation représente un caractère et un seul.
Pour mettre cela en évidence ajoutons deux nouveaux noms de fichiers à ceux que nous avions déjà, 311.ARCH et un.text. Maintenant, affichons la liste de tous les fichiers qui possèdent exactement quatre caractères après le point :
ls *.????
fera exactement cela et fera apparaître dans la liste affichée en sortie nos deux nouveaux fichiers.
Le joker point d'interrogation est aussi un moyen utile d'éviter le « piège de la négation » mentionné à la fin de la section #Le joker *. Ainsi, la ligne de commande :
rm *[!4]?.*
doit être comprise comme : « effacer tous les fichiers dont le nom contient au moins deux caractères avant le point sauf ceux qui possèdent un 4 dans l'avant-dernière position avant le point » et elle efface donc, dans le répertoire qui nous sert d'exemple, tous les fichiers (124.bak, 583.bak, 311.ARCH et un.text), à la seule exception de 346.bak.
[modifier] Tester la présence d'une gamme de caractères
Autre chose encore ? Mais oui. Nous avons vu jusqu'ici des cas d'expansion de nom de fichier dans lesquels pour une certaine position on testait la présence d'un seul caractère. Mais rien n'empêche de tester plus d'un caractère dans une même position :
ls [13]*
affiche la liste de tous les fichiers qui commencent par le caractère 1 ou par le caractère 3; dans notre exemple les fichiers 124.bak, 311.ARCH et 346.bak correspondent. Notez que vous devez mettre les caractères concernés entre crochets, sinon ce seraient les fichiers qui commencent par 13 qui seraient sélectionnés.
Il ne manque plus à notre bonheur que la possibilité de définir des expansions pour des gammes entières de caractères.
ls *[3-8]?.*
affiche la liste de tous les fichiers dont l'avant-dernier caractère avant le point est un nombre entre 3 inclus et 8 inclus. Dans notre exemple cela correspond aux fichiers 346.bak et 583.bak.
Enfin, il est aussi possible, grâce aux crochets, d'exiger la présence d'un caractère qui n'appartienne pas à une certaine gamme de caractères. Il suffit pour cela de faire précéder la liste des caractères entre crochets par le signe de négation ! dont il a déjà été question dans cette page (à la place de !, le signe ^ serait aussi possible aussi, du reste). Ainsi :
ls *[!4-8]?.bak
afficherait la liste des fichiers dont le nom se termine par .bak précédé d'un caractère quelconque (?), lui-même précédé d'un caractère qui ne doit pas être l'un des chiffres allant de 4 à 8. 346.bak et 586.bak ne seraient donc pas affichés mais 124.bak le serait.
[modifier] Expansion des noms de fichiers et caractères spéciaux
Ces puissants mécanismes d'expansion ont un inconvénient : le shell tentera toujours de les mettre en œuvre et il le fera avant que la commande n'interprète ses arguments. Il peut alors arriver que ces mécanismes se mettent en travers de votre chemin.
Supposez que vous ayez aussi, dans le répertoire qui nous a servi d'exemple dans les sections précédentes, un fichier dénommé !56.bak. Essayez de faire en sorte qu'il soit sélectionné par l'expansion de noms de fichiers :
rm !* rm rm: opérande manquante
Le shell interprète !* comme une substitution d'une commande invoquant l'historique (signifiant : « insérer tous les arguments de la commande précédente »), et non comme un indicateur d'expansion de fichier. (Tant que vous y êtes, notez donc aussi que !$ aurait signifié « insérer le dernier argument de la commande précédente ». Deux abréviations bien utiles, à retenir. Sur tout ceci voir L'historique du shell).
Un certain nombre d'outils de la ligne de commande sous Linux, tels que (e)grep, sed, awk, find et locate doivent traiter eux-mêmes les expansions de nom de fichiers.
Afin que seule la commande puisse les interpréter, et non le shell, on doit les mettre entre guillemets :
find . -name *[A-Z]* -print find: les chemins doivent précéder l'expression
Ici la commande find devrait rechercher tous les fichiers qui contiennent (au moins) une lettre majuscule, mais elle ne renvoie en fait qu'un message d'erreur ! La version appropriée, avec l'expression suivant -name entre guillemets, sera :
find . -name '*[A-Z]*' -print ./311.ARCH
Vous pouvez aussi protéger des caractères spéciaux tels que !, $, ? ou une espace vide à l'aide d'une barre oblique inverse (anglais backslash) :
ls \!* !56.bak
ou avec des guillemets (simples) :
ls '!'* !56.bak
Noter que la question de savoir où placer les guillemets peut alors se poser.
ls '!*'
chercherait un fichier nommé '!*' puisque le second joker serait alors entre guillemets lui aussi, et de ce fait interprété littéralement.
[modifier] Les méta-caractères et les fichiers cachés
Par défaut, les jokers ne « voient » pas le point initial des noms de fichiers ou de répertoires « cachés ». Sur tout cela, voir cette section.
[modifier] La redirection des sorties
C'est la philosophie d'Unix que de développer beaucoup de petits programmes qui excellent chacun dans une tâche particulière. Les tâches complexes ne sont pas accomplies par des programmes complexes mais plutôt en attachant bout à bout des programmes les uns aux autres à l'aide d'un petit nombre de mécanismes du shell. L'un d'eux est la redirection de sorties.
[modifier] Redirection entre commandes
On fait cela à l'aide de « tubes » (anglais pipe), représentés par le symbole |. La syntaxe est la suivante :
commande1 | commande2 | commande3 etc
Vous en avez sûrement déjà rencontré. Ils sont fréquemment utilisés pour rediriger la sortie d'un programme vers un visionneur de page comme more ou less, comme dans :
ls -l | less
La première commande envoie une liste du contenu du répertoire de travail et la seconde l'affiche et permet de la faire défiler commodément. Voici un exemple plus complexe :
rpm -qa | grep ^x | less
La première commande envoie une liste de tous les RPM installés, la seconde ne retient (grâce au « filtre » grep) que ceux qui commencent par un x (^x) et la troisième affiche le résultat sous forme d'une liste qu'on peut faire défiler page par page (attention, pour voir apparaître l'affichage en console, il peut être nécessaire de patienter un peu, le traitement de la liste des rpm étant assez long).
[modifier] Redirection vers un fichier ou en provenance d'un fichier
On peut vouloir sauvegarder la sortie d'une commande dans un fichier ou au contraire fournir à une commande un argument en provenance d'un fichier.
C'est ce que font les opérateurs de redirection > et <.
Une ligne de commande de la forme :
commande > fichier
sauvegarde la sortie de commande dans fichier en écrasant la totalité du contenu précédent de fichier. Par exemple :
ls > liste_du_rep
sauvegarde la liste du contenu du répertoire courant dans un fichier appelé liste_du_rep.
Une ligne de commande de la forme :
commande < fichier
utilise fichier comme entrée de commande.
Il est possible d'utiliser les deux opérateurs dans un même ligne, par exemple comme ceci :
sort < liste_du_rep > liste_du_rep_triee
envoie le contenu de liste_du_rep à la commande sort, qui le trie et place le contenu trié obtenu en sortie dans le fichier liste_du_rep_triee. Mais, bien sûr, si vous êtes malin, vous ferez tout cela en une seule étape, à l'aide d'un tube :
ls | sort > liste_du_rep_triee
Voilà maintenant un cas particulier de redirection :
commande 2> fichier
Ceci place uniquement les messages d'erreur de commande dans fichier. Cela peut se révéler utile de temps en temps...
Un autre opérateur est >>. Celui-ci ajoute la sortie au contenu d'un fichier préexistant :
echo "chaîne" >> fichier
ajoute chaîne au contenu du fichier fichier. Voilà donc une façon d'éditer rapidement un fichier sans ouvrir un éditeur de texte !
Il y a cependant une contrainte importante qui pèse sur les opérateurs < et > : Quelque chose comme :
commande < fichier1 > fichier1
effacera le contenu de fichier1. Toutefois
commande < fichier1 >> fichier1
marchera et ajoutera le contenu traité de fichier1 au même fichier.
Cela fait pas mal de choses, tout ça, non ? ;-) Pas de quoi paniquer, vous pouvez tout apprendre pas à pas à votre rythme. La pratique conduit à la perfection... Une fois que vous serez familiarisés avec les mécanismes du shell les plus courants, vous pourrez éprouver le besoin de personnaliser votre environnement. Vous trouverez quelques suggestions dans les deux prochaines sections. Dans la dernière section vous trouverez une petite FAQ qui traite des messages d'erreur les plus courants du shell et de certains paramétrages mineurs de la configuration.
[modifier] Les fichiers de configuration du shell Bash
Lorsque vous faites, dans votre répertoire personnel,
ls .bash*
toute une liste de fichiers s'affiche :
- .bash_history contient une liste des commandes que vous avez lancées
- .bash_logout contient une liste de commandes qui sont exécutées lorsque vous quittez le shell
- .bash_profile contient une liste de commandes qui sont exécutées lorsque vous vous identifiez
- .bashrc contient une liste de commandes qui s'exécutent chaque fois que vous ouvrez un nouveau shell.
Notez bien la différence suivante entre les deux derniers fichiers : .bash_profile est lu une seule fois en début de session, alors que .bashrc est lu chaque fois que vous ouvrez un nouveau terminal (autrement dit une nouvelle fenêtre xterm). Traditionnellement, lors d'une installation, vous êtes censé définir des variables telles que PATH dans .bash_profile, et des éléments tels que des alias ou des fonctions dans .bashrc.
Tous les fichiers dont nous venons de parler définissent des paramétrages pour un utilisateur particulier. Les paramétrages pour l'ensemble du système sont stockés dans :
- /etc/profile
- /etc/bashrc
et dans les fichiers du répertoire :
- /etc/profile.d
Vous devriez cependant opter autant que possible pour une configuration des fichiers utilisateur : éditer ces fichiers ne vous oblige pas à passer en root et ils vous permettent de définir des paramétrages différents pour root et pour chaque compte utilisateur, ce qui peut être une bonne chose. En cas de conflit entre les paramétrages utilisateur et les paramétrages système ce sont les paramétrages utilisateur qui l'emportent.
Pour plus d'informations sur tout cela voir la page sur Les fichiers de configuration du shell.
[modifier] Maîtriser l'invite de la ligne de commande
L'invite est la première chose que vous voyez lorsque vous ouvrez une console (un xterm). Elle ressemble à ceci :
[compte@nomdhote ~]$
Par défaut, elle affiche votre nom d'utilisateur suivi de l'arobase (@) puis le nom d'hôte de votre machine (qui par défaut sera localhost) et le nom du répertoire de travail courant (le tilde (~ ) est le raccourci Unix pour le répertoire personnel).
Traditionnellement, le dernier caractère de l'invite indique si vous êtes connecté comme simple utilisateur ($) ou comme root, auquel cas il est remplacé par un dièse (#).
Vous pouvez définir ou modifier votre invite en changeant le contenu de la variable $PS1. La commande :
echo $PS1
affiche la valeur courante de cette variable. Vous trouverez les caractères spéciaux qui s'affichent alors, avec leur signification, dans man bash, à la section SYMBOLE D'ACCUEIL. Note : Pour faire une recherche dans bash, une fois le fichier ouvert, tapez une barre oblique /, puis le ou les mots que vous souhaitez trouver. Pour plus de détails voir (futur lien) Prise en main de man.
Besoin d'une suggestion de ce que pourrait être une meilleure invite ? Eh bien, tout d'abord, l'invite par défaut n'est pas très adaptée aux utilisateurs oublieux, car elle montre seulement la dernière partie de votre chemin courant. Si vous voyez une invite comme :
[julie@paradis bin]$
votre répertoire de travail courant pourrait être /bin, /usr/bin, /usr/local/bin ou /usr/X11R6/bin. Evidemment, vous pouvez toujours taper :
pwd
(anglais « print working directory » = « afficher le répertoire de travail »)
pour découvrir où vous vous trouvez mais n'y aurait-il pas un moyen de dire au shell d'indiquer cela de lui-même ?
Mais si, il y en a bel et bien un ! L'aspect de l'invite - et une grande part des autres paramètrages que nous évoquons ici - est fixé dans /etc/bashrc. Vous pouvez modifier ce fichier en l'éditant sous root dans un éditeur de texte. Vous pouvez aussi changer l'invite pour un unique utilisateur particulier en éditant .bash_profile ou .bashrc dans le répertoire personnel de cet utilisateur, voir (#Les fichiers de configuration du shell Bash).
Les paramètres qui permettent de modifier l'invite sont décrits dans man bash, section SYMBOLE D'ACCUEIL. Vous pouvez ajouter des petites choses très chouettes comme l'heure qu'il est, sous différents formats, ou le numéro d'historique de la commande et même diverses couleurs d'affichage.
Mon paramétrage favori, celui qui figure dans mon fichier utilisateur .bashrc est :
PS1="\[\033[1m\][\w]\[\033[0m\] "
le .bashrc du compte root contient :
PS1="\[\033[0;31m\][\w]\[\033[0m\] "
et j'obtiens une invite telle que :
[/usr/bin]
où seul le chemin (complet) du répertoire courant apparaît. J'ai éliminé le nom d'utilisateur et le nom de machine, qui ne me sont d'aucune utilité. Mais je veux pouvoir me rendre compte au premier coup d'oeil si je suis connecté à la console comme utilisateur ou comme root : avec ces paramétrages l'invite utilisateur sera noire sur fond clair ou blanche sur fond sombre tandis que l'invite de root sera toujours rouge.
Ce qui donne donc :
Utilisateur :
Superutilisateur (root) :
Pour mieux comprendre...
Pour obtenir des informations claires et précises sur le codage des couleurs tel qu'il est utilisé dans les exemples qui précèdent et dans celui qui suit, on pourra consulter Le shell en couleur : du bon usage des codes couleur ANSI. |
Un paramétrage plus modeste pourrait être :
PS1="\u: \w\\$ "
qui aboutirait à des invites de ce type :
nom_d_utilisateur: /$
Par exemple :
mais qui veut vraiment rester modeste ? :-)
Vous pouvez essayer divers paramétrages à la volée en utilisant la commande export, par exemple
export PS1="\u: \w\\$ "
Si vous avez trouvé une invite qui vous va, mettez-la donc dans votre .bashrc. Elle sera activée automatiquement sur chaque console (sur chaque terminal) que vous ouvrirez.
Vous pouvez même « thématiser » votre invite, autrement dit utiliser différentes couleurs ou la faire ressembler à une bonne vieille invite de C64...
Pour essayer... :
Pour essayer chacune des invites que nous venons de mentionner, vous pouvez : - sélectionner dans la présente fenêtre la ligne $PS1 = ... qui lui correspond, Le résultat apparaîtra immédiatement... |