Généralités sur les commandes
Raccourcis de la ligne de commande
Un terminal de commandes est un environnement d'exécution. Les fonctionnalité de saisie au clavier ne sont pas les mêmes que celles procurées par un éditeur de code ou un traitement de texte.
En particulier, les raccourcis usuels Ctrlc et Ctrlv des fonctionnalités copier‑coller, ou encore Ctrlz pour annuler la dernière opération, ne sont pas valides.
Néanmoins, avec un système d'exploitation Linux muni d'un bureau, les fonctionnalités copier‑coller restent accessibles via le menu contextuel du terminal, affiché par un clic droit de la souris.
Pour faciliter le travail des administrateurs, le terminal de commande dispose de très nombreux raccourcis , avec parfois plusieurs variantes. Cette diversité s'explique par des considérations historiques sur l'évolution des claviers : les variantes anciennes sont adaptées à des claviers minimaux (sans touches de flèches).
L'acquisition des raccourcis prend du temps et nécessite une pratique régulière. Il faut donc l'envisager sur le long terme et ne pas se décourager, d'autant plus que les listes données ci‑après ne sont pas exhaustives. Pour plus de détails, on pourra se reporter à ce lien G
Contrôle du processus d'exécution
En l'absence d'erreur, toute commande validée par l'appui sur la touche ENTRÉE ↵ lance un processus d'exécution dont la durée peut être longue.
À tout moment, il est possible d'abandonner cette exécution ou de la mettre en arrière‑plan pour reprendre la main et lancer d'autres commandes.
En dernier recours en cas de dysfonctionnement, il est parfois nécessaires de fermer le terminal pour interrompre l'exécution d'une commande jugée problématique.
| Raccourcis | Effet |
|---|---|
| Ctrlc | abandonne d'exécution de la commande en cours (cancel) |
| Ctrlz | met en pause et en arrière‑plan le processus d'exécution de la commande en cours |
| Ctrld | ferme le terminal (commande exit) |
Mouvement du curseur dans la ligne courante
Dans un terminal de commandes en ligne, le curseur opère en mode insertion. Sa position est contrôlable par les raccourcis claviers listés dans le tableau ci‑dessous.
| Raccourcis | Effet |
|---|---|
| Ctrla ou ↖ | va au début de ligne courante |
| Ctrle ou FIN | va en fin de ligne courante |
| → ou Ctrl f | avance d'un caractère dans la ligne courante (forward) |
| ← ou Ctrl b | recule d'un caractère dans la ligne courante (backward) |
| Ctrl→ ou Alt f | avance d'un mot dans la ligne courante |
| Ctrl← ou Alt b | recule d'un mot dans la ligne courante |
Effacement de texte dans la ligne courante
On dispose aussi de raccourci pour effacer du texte part et d'autre du curseur. De plus, il existe deux raccourcis remarquables :
- l'un pour annuler une modification dans la ligne courante ;
- l'autre pour coller du texte préalablement effacé.
| Raccourcis | Effet |
|---|---|
| Ctrlk | efface tout le texte après le curseur |
| Ctrlu | efface tout le texte avant le curseur |
| ⟵ ou Ctrl d | efface le caractère avant le curseur (delete) |
| SUPPR ou Ctrl h | efface le caractère sous le curseur (hover) |
| Ctrlw | efface le mot avant le curseur |
| Altd | efface le mot après le curseur |
| Ctrly | colle devant le curseur le dernier motif effacé dans la ligne courante |
| Ctrl_ | annule la dernière modification dans la ligne courante |
Navigation verticale dans le terminal
Il existe aussi des raccourcis pour naviguer verticalement dans le contenu du terminal si ce dernier dépasse la capacité d'affichage permise par la hauteur de la fenêtre.
| Raccourcis | Effet |
|---|---|
| Shift↖ | remonte l'affichage au début du terminal |
| ShiftFIN | descend l'affichage à la fin du terminal |
| Shift⇞ | remonte l'affichage d'une « page » du terminal |
| Shift⇟ | descend l'affichage d'une « page » du terminal |
| Ctrll ou CtrlL | rafraîchit la fenêtre du terminal (n'efface pas le contenu précédent qui peut être consulté en remontant) |
Auto‑complétion du nom de commande
Dans un terminal de commandes, le nom d'une commande saisie bénéficie d'un mécanisme d'auto‑complétion via la touche TAB (autre symbole ↹) ou le raccourci Ctrli.
Après avoir saisi les premières lettres d'une commande :
- un premier appui sur la touche TAB déclenche la complétion automatique s'il n'existe qu'une seule commande connue dont le nom commence par ces lettres ;
- sinon, il faut un deuxième appui sur la touche TAB pour afficher la liste de toutes les commandes connues dont le nom commence par ces lettres.
Après avoir saisi les lettres « rm » dans la barre de commande :
- un premier appui sur la touche TAB ne produit rien ;
- un deuxième appui sur la touche TAB affiche :
rm rmdir rmid rmiregistry mmod mt rmt-tar
Accès à l'historique des commandes
À tout moment, les touches ↑ et ↓ du clavier permettent de naviguer dans l'historique des commandes précédemment validées, comme si elles étaient saisies dans la ligne courante.
La saisie en cours est également mémorisée temporairement. Elle est oubliée seulement si, in fine, elle n'est pas validée par appui sur la touche ENTRÉE.
La commande history
La commande history suivie d'un nombre n affiche une liste numérotée des n commandes précédemment validées par l'utilisateur (même si leur exécution a échoué) – les plus récentes étant les dernières affichées.
Il est alors possible de retrouver une commande mémorisée et de la récupérer dans la barre de commande par copier‑coller via le menu contextuel du terminal.
La liste des commandes affichées par history se compose :
- de toutes les commandes validées depuis l'ouverture du terminal ;
- précédées des commandes mémorisées dans un fichier nommé
.bash_history;
dans la limite définie par la valeur de la variable d'environnement $HISTSIZE – cf. chap. S1‑IV .
Le fichier .bash_history
Le fichier .bash_history est un fichier de type texte placé dans le répertoire maison de l'utilisateur. Son contenu peut donc être affiché notamment par la commande cat (cf. infra ), ou même édité.
C'est seulement lors de la fermeture d'un terminal que la mémorisation des commandes dans le fichier .bash_history (cf. supra) est effectuée. C'est pourquoi les commandes validées dans une fenêtre de terminal ouverte en parallèle ne sont pas affichées par la commande history validée dans une autre fenêtre de terminal.
Le nombre maximal de commandes mémorisable dans le fichier .bash_history est fixé par la valeur de la variable d'environnement $HISTFILESIZE.
Pour enregistrer dans le fichier .bash_history les commandes validées dans une fenêtre de terminal sans attendre sa fermeture, il suffit de saisir la commande :
history -a
La commande fc
La commande fc (find command) est plus polyvalente que history. Elle permet d'afficher ou d'exécuter des commandes mémorisées dans l'historique.
L'emploi de la fonction fc peut être complexe, notamment lorsqu'il se combine avec des redirections (cf. chap. S1‑IV ). Néanmoins, on peut dores et déjà exposer les trois usages simples ci‑dessous :
- Pour lister les commandes de l'historique :
fc -l[premier nº] [dernier nº]
fc -snº
fcnº
nano). Après sauvegarde et sortie de l'éditeur, il suffit d'appuyer sur la touche ↑ pour récupérer cette commande modifiée dans la ligne courante. Les différents types de commandes
On peut distinguer deux grands types de commandes du shell Linux :
- Il y a les commandes internes – en anglais, built‑in – appelées aussi primitives du shell. Elles n'ont pas de fichier exécutable distinct et ne peuvent être modifiées que par une mise à jour du shell lui‑même.
- Il y a les commandes externes, qui sont implémentées soit par des fichiers exécutables ou par des scripts. Elles peuvent donc être mis à jour indépendamment les unes des autres.
Par ailleurs :
- Certaines commandes externes sont, en certaines circonstances, répertoriées par le shell dans une table de hachage W stockée en mémoire cache W pour un accès plus rapide. On dit alors qu'elles sont hachées.
- Certaines commandes n'en sont pas réellement mais sont définies comme alias d'une autre commande, éventuellement avec une ou plusieurs option(s) particulièrement utile(s), donc a priori d'usage fréquent.
La commande type
La commande type W, appliquée à un nom de commande affiche le type de cette commande :
- S'il s'agit d'une commande externe, elle donne le chemin d'accès à son exécutable ou son script ; sinon, elle indique simplement qu'il s'agit d'une primitive du shell.
- Elle précise aussi si la commande est présentement hachée ou s'il s'agit d'un alias.
Voici cinq exemples typiques de réponses données par la commande type, correspondant aux différents types de commandes détaillées supra :
type historyhistory est une primitive du shelltype rmrm est /usr/bin/rmtype manman est haché (/usr/bin/man)type llll est un alias vers « ls -alF »type lkbash: type: lk : non trouvé
Forme générale d'une commande en shell
De façon simplifiée, une commande shell se code selon la forme générale suivante :
identificateuroption(s)argument(s)
où :
- l'identificateur est le nom d'une commande interne ou externe du shell ;
- les options sont des codes répertoriés qui modifient l'action de la commande ;
- le ou les arguments sont des éléments sur lesquels la commande agit – typiquement, des fichiers, des répertoires, des commandes…)
Mais en pratique, la forme d'une commande shell peut être bien plus complexe :
- Certaines options sont susceptibles de prendre des arguments (en plus de ceux de la commande elle‑même).
gcc -Wall -Wextrafichier source-ofichier exécutable
mkdirnom du répertoire&&cdnom du répertoire
Syntaxe des options
Une option de commandes du shell se code toujours :
- soit avec un tiret initial
-et une ou plusieurs lettres‑codes, comme par exemple-h; - soit avec deux tirets initiaux
--et un nom explicite, comme par exemple--help;
En raison de leur brièveté, les formes courtes sont bien adaptées pour la saisie des commandes à la volée dans un terminal d'exécution.
Les formes longues sont, quant à elles, mieux adaptées pour le codage des scripts, c'est‑à‑dire des programmes de commandes qui servent à automatiser les tâches d'administration. Elles apportent en effet une meilleure lisibilité que les formes courtes. Et le fait qu'elles soient plus longues à saisir que les formes courtes ne doit pas être perçu comme un inconvénient significatif : comme pour tout programme, le temps de saisie est faible comparativement à celui de la conception, et un programme est toujours bien plus lu qu'il n'est écrit (cf. chap. C1‑I ).
Séparateur entre les options et les arguments
Dans le codage d'une commande, le séquence de symboles --, lorsqu'elle n'est pas immédiatement suivie d'un identificateur d'option, est interprétée par le shell comme séparateur explicite entre les options et les arguments de la commande.
Autrement dit, après le séparateur --, tout identificateur est interprété comme étant un argument de la commande, même s'il commence par le tiret -.
Le séparateur -- permet ainsi de coder des arguments de commande qui commencent par un tiret -.
Les deux saisies ci‑dessous montre la nécessité de recourir au séparateur -- pour créer un répertoire nommé -test avec la commande mkdir (make directory) :
mkdir -testmkdir : option invalide -- 't' Saisissez « mkdir --help » pour plus d'informations.mkdir ---testls-test
Valeur de retour d'une commande
Toute commande exécutée dans le shell retourne en fin d'exécution une valeur numérique qui code la façon dont le processus d'exécution s'est déroulée. Cette valeur est un nombre entier non signé codé sur 8 bits – donc compris entre 0 et 255 (cf. chap. C3‑II ).
Par convention :
- la valeur
0code le succès de l'exécution, c'est‑à‑dire l'absence d'erreur détectée ; - les autres valeurs pouvant représenter divers codes d'erreur, afin de faciliter le diagnostic du problème lié à la mauvaise exécution de la commande.
La valeur de retour d'une commande n'est jamais affichée spontanément dans le terminal d'exécution. Néanmoins, il est possible :
- de l'exploiter dans un script d'exécution, comme avec une fonction dans n'importe quel programme ;
- de l'afficher dans le même terminal en exécutant immédiatement après la commande :
echo $?
Le scénario d'exécution ci‑dessous montre différentes valeurs de retour d'une même commande selon qu'elle est correctement saisie ou non.
cd /us/binbash: cd: /us/bin: Aucun fichier ou dossier de ce typeecho $?1cb /us/bincb : commande introuvableecho $?127cd /usr/binecho $?0
Aide en ligne des commandes
Les commandes du shell disposent d'une importante documentation qui est directement accessible à l'utilisateur dans le terminal d'exécution via diverses commandes ou options. On peut citer notamment :
- l'option d'aide, affichée via le code
--helpet/ou-h(selon les commandes) ; - le manuel, affichée via la commande
man; - les pages d'information, affichée via la commande
info.
Toutefois, aucune de ces accès n'est systématiquement disponible pour toutes les commandes. Certaines n'ont pas d'option, d'autres pas de manuel ni d'option… Il est donc utile de les connaître tous pour en tenter un quand l'autre ne fonctionne pas.
L'option d'aide
L'option d'aide d'une commande, lorsqu'elle est disponible, est typiquement obtenue en invoquant cette commande avec l'option --help et/ou -h (selon la commande).
Elle fournit à l'utilisateur un premier niveau de détail sur l'emploi d'une commande et de ses principales options.
L'option d'aide est particulièrement appréciée lors d'une phase de découverte d'une commande complexe, pour ne pas être submergé par la description exhaustive des options détaillées dans le manuel.
Relativement peu abondante, elle est présentée sans pagination, c'est‑à‑dire sans interruption de l'affichage lorsque la hauteur de la fenêtre du terminal est insuffisante pour l'afficher dans sa totalité.
Pour certaines commandes, la commande d'affichage de l'aide peut être alternativement codée via la commande help, tout simplement ainsi :
helpnom de commande
De plus, avec l'option help -m … les informations sont présentées de comme dans les pages de manuel (cf. infra).
Le manuel
Généralités
Le manuel W est une documentation volumineuse mise en place dans les premières années de mise au point du système Unix. Elle a vocation à l'exhaustivité des explications : pour une commande donnée, elle en détaille toutes les options possibles.
De plus, le manuel ne se limite pas aux commandes du shell : il traite aussi des fonctions de bibliothèques, des appels systèmes, des fichiers particuliers du système et même de certains concepts abstraits.
Le manuel est composé de « pages », c'est‑à‑dire de textes qui chacun fournissent la documentation sur une commande précise ou autre (fichier, etc.). Il est accessible en utilisant la commande :
mannom de la commande
Les pages sont regroupées par catégories thématiques dans ce qu'on appelle les sections numérotées du manuel :
- Commandes du shell internes et externes
- Appels systèmes (API W du noyau, utilisée par les développeurs système)
- fonctions de bibliothèques (
libCW ou autres) - fichiers spéciaux (
/dev/sdXou autres)
etc.
(Exécuter la commande man man et consulter la rubrique DESCRIPTION pour plus de détails sur les différentes sections du manuel et leur contenu).
Structure d'une page du manuel
Chaque page du manuel commence par un en‑tête qui précise entre parenthèse le numéro de la section du manuel à laquelle la pages appartient.
De plus, la page est structurée en plusieurs rubriques, variables selon la complexité de la commande (ou du fichier, ou autre) qu'elle documente.
Typiquement, les rubriques d'une page de manuel sont :
- le nom (
NAME), avec une brève explication du rôle de la commande ; - le synoptique (
SYNOPSYS), c'est‑à‑dire la forme syntaxique générale d'emploi de la commande avec ses éventuelles options et arguments ; - la description (
DESCRIPTION) de la commande selon ses différentes options possibles ; - l'auteur (
AUTHOR) de la commande ; - etc.
Dans le cas d'une commande très simple comme pwd (print working directory), la page de manuel présente seulement 7 rubriques et peut être affichée complètement sur un moniteur de taille usuelle.
man pwdPWD(1) User Commands PWD(1) NAME pwd - print name of current/working directory SYNOPSIS pwd [OPTION]... DESCRIPTION Print the full filename of the current working directory. -L, --logical use PWD from environment, even if it contains symlinks -P, --physical avoid all symlinks --help display this help and exit --version output version information and exit If no option is specified, -P is assumed. NOTE: your shell may have its own version of pwd, which usually supersedes the version described here. Please refer to your shell's documentation for details about the options it supports. AUTHOR Written by Jim Meyering. REPORTING BUGS GNU coreutils online help: <https://www.gnu.org/software/coreutils/> Report any translation bugs to <https://translationproject.org/team/> COPYRIGHT Copyright © 2020 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. SEE ALSO getcwd(3) Full documentation <https://www.gnu.org/software/coreutils/pwd> or available locally via: info '(coreutils) pwd invocation' GNU coreutils 8.32 February 2022 PWD(1)
La commande whatis
La commande whatis affiche seulement la rubrique NAME de la page de manuel d'une commande ou autre (si cette dernière existe, bien entendu). Elle permet de se faire très rapidement une idée du rôle de la commande.
En appliquant la commande whatis à de la commande pwd, on obtient sans surprise la sortie suivante :
whatis pwdpwd (1) - print name of current/working directory
Extension du manuel
Sur un poste de travail, le manuel peut faire l'objet d'extensions avec des pages spéciales supplémentaires – pages au standard POSIX (cf. chap. S1‑I ), documentation pour les développeurs – ou des versions linguistiques.
Pour disposer de ces extensions, il suffit d'installer des paquets avec les outils d'installation de la distribution (typiquement sudo apt install sous Debian et autres). Les principaux paquets d'extension sont les suivantes :
-
manpages-fr– pages traduites en français ; -
manpages-fr-extra– pages de commandes supplémentaires en français ; -
manpages-posix– pages des commandes faisant l'objet d'une spécification POSIX ; -
manpages-dev– pages des commandes pour les développeurs.
Les pageurs
La documentation du manuel, parce qu'elle est très souvent volumineuse même pour une simple commande, fait l'objet lors de son affichage d'une pagination via un programme appelé pageur.
Ainsi, la « page » n'est pas affichée en totalité d'un coup mais portion par portion – c'est pourquoi on parle aussi de page – dans la limite de la hauteur de la fenêtre du terminal où la commande man est exécutée.
Comme d'autres composants logiciels un tant soit peu complexes, le pageur a évolué au fur et à mesure de l'évolution d'Unix :
- Il y a d'abord eu
moreW, puislessW (qui permettait de remonter vers les pages précédentes de l'affichage). - La plupart des distributions modernes de Linux (Debian, Ubuntu, Mint, Fedora…) utilisent par défaut
pager. - Mais pour une meilleure lisibilité de la documentation, avec l'exploitation de la couleur et du multi‑fenêtrage, il est recommandé d'utiliser
mostW.
Sachant que tous ces pageurs sont aussi utilisables pour d'autre affichage que les pages de manuel, sous forme de commande du shell.
L'installation du pageur most nécessite les deux étapes suivantes :
- l'installation du paquet, qui s'effectue de façon très classique comme ci‑dessous sous Debian, Ubuntu, Mint ;
sudo apt install most -y
- l'ajout dans le fichier
.bashrc(dans le répertoire maison de l'utilisateur) de la ligne ci‑dessous :
export PAGER="most"
source ~/.bashrc
Le pageur met en œuvre une surcouche dans l'environnement d'exécution du terminal. Dans le cas de most, on dispose des raccourcis suivants, qui sont tous insensibles à la casse :
| Raccourcis | Effet |
|---|---|
| ESPACE ou ⇟ ou d | affiche la page suivante (down) |
| ⟵ ou ⇞ ou u | affiche la page précédente (up) |
| ENTRÉE ↵ ou ↓ | déplace le curseur à la ligne suivante |
| ↑ | déplace le curseur à la ligne précédente |
| s ou f ou / | active la barre de recherche en mode vers le bas (search forward) |
| ? | active la barre de recherche en mode vers le haut (backward) |
| n | cherche l'occurrence suivante du dernier motif recherché dans la même direction (next) |
| h | affiche les informations d'aide, détaillant tous les raccourcis (help) |
| q | quitte le manuel pour revenir au shell. |
L'outil d'information GNU
Parmi les apports du projet GNU (cf. chap. S1‑I ) figure la commande info, dans une perspective de refonte totale de l'outil de documentation d'Unix.
Mais dans la pratique, les habitudes ayant la vie dure, la commande man reste largement utilisée par la communauté des utilisateurs de Linux.
En comparaison de man, la commande info présente certains avantages :
- Elle possède plus d'entrées et pour chacune, fournit plus d'explication et en particulier un grand nombre d'exemples concrets d'utilisation des commandes.
- Elle propose une présentation différente de la documentation, à la manière d'un hypertexte avec des liens qui permettent de naviguer d'une page à l'autre (il suffit de déplacer le curseur sur ces liens et d'appuyer sur la touche ENTRÉE).
- Lorsqu'elle est appelée sans argument, elle ouvre la page du sommaire général de toutes les grandes rubriques qui la structurent.
Cependant, la commande info recourt à un pageur interne qui ne peut pas être modifié ; on ne peut donc pas employer most pour avoir un affichage en couleur. De plus, elle n'utilise pas les mêmes raccourcis que la plupart des autres pageurs.
Mais pour remédier à ces deux inconvénients, il existe la commande pinfo qui est disponible après installation du paquet éponyme.
Outils de recherche d'une commande
Il arrive que l'on soit amené à chercher une commande sur une machine Linux. Tout dépend alors si l'identificateur de la commande est parfaitement connu ou non. En effet, le nom d'un paquet ne coïncide pas forcément avec celui de la commande qui le met en œuvre (par exemple, le paquet sublime-text est mis en œuvre par la commande subl).
En plus de celles pour les fichiers en général, détaillées plus loin , on dispose de plusieurs commandes spécifiques à la recherche de commandes : type (cf. supra ), which, whereis, compgen, apropos.
La commande which
La commande which W, appliquée à un nom connu de commande, permet de localiser le chemin d'accès à son exécutable.
Plus précisément, elle affiche le premier chemin trouvé d'un exécutable portant le nom de commande passé en argument en cherchant dans les répertoires listés par la variable d'environnement $PATH. En cas d'échec, elle n'affiche rien (contrairement à type qui est explicite).
Voici trois exemples typiques de réponses données par la commande which :
which info/usr/bin/infowhich packettracer # installed/usr/local/bin/packettracerwhich eclipse # not installed
où, dans le dernier cas, on obtient une réponse vide car la commande n'est pas installée.
La commande whereis
La commande whereis appliquée à un nom connu de commande affiche un voire des chemin d'accès respectivement :
- au(x) fichier(s) exécutable(s) de la commande ;
- aux fichiers (re)source éventuellement disponibles ;
- aux fichiers des pages de manuels de la commande (si elle est documentée).
Un exemple typique de résultat donné par la commande whereis est donné ci‑dessous :
whereis sedsed: /usr/bin/sed /usr/share/man/man1/sed.1posix.gz /usr/share/man/man1/sed.1.gz /usr/share/info/sed.info.gz
Et l'on constate que :
La commande compgen
Pour rechercher une commande de nom inconnu ou partiellement connu (premières lettres), on peut recourir à l'auto‑complétion (cf. supra ), soit à la commande compgen ou encore complete.
La commande compgen (completion generator) est une primitive du shell qui comporte de nombreuses options, mais malheureusement, pas de page de manuel ni d'information GNU).
La forme d'emploi usuel de cette commande est :
compgenoptionmotif
où le motif est une chaîne de caractère que la commande va chercher à compléter avec des éléments installés du système. Lorsque cet argument n'est pas saisi, la commande propose toutes les complétions possibles.
Quant aux options :
-
-climite la complétion aux commandes ; -
-blimite la complétion aux primitives du shell (builtin).
Voici quelques exemples classiques d'utilisation de compgen :
compgen -b # liste de toutes les primitives disponiblescompgen -c su # liste de toutes les commandes commençant par "su"
(Les réponses ne sont pas données car sans intérêt pédagogique.)
La commande apropos
Pour rechercher une commande par par motifs (qui ne constituent pas nécessairement le début du nom de la commande), il existe la commande apropos.
La commande apropos W affiche la liste des pages du manuel dont la rubrique NAME (cf. supra ) comporte le ou les motifs passés en argument.
Lorsque le motif saisi est court ou très banal, la liste affichée par apropos risque d'être très longue, aussi est‑il recommandé d'utiliser certaines options, notamment :
-
-equi impose une occurrence exacte dans la rubriqueNAMEdu ou des motifs passés en arguments ; -
-aqui impose que tous (all) les motifs passés en arguments soient présents dans la rubriqueNAME; -
-squi limite la recherche aux numéros de section du manuel saisis juste après.
- Pour trouver des commandes qui opèrent sur la configuration du GRUB (cf. chap. S1‑II ), il n'est pas efficace de saisir :
- Pour trouver des commandes qui opèrent sur les groupes d'utilisateurs (cf. chap. S1‑V ), il n'est pas efficace de saisir :
apropos grub config
config » étant très banal, on obtient plusieurs centaines de réponses. En revanche, avec l'option -a on obtient 4 réponses pertinentes : apropos -a grub configgrub-mkconfig (8) - generate a GRUB configuration file grub-syslinux2cfg (1) - transform syslinux config into grub.cfg update-grub (8) - stub for grub-mkconfig update-grub2 (8) - stub for grub-mkconfig
apropos group
group » étant très banal, on obtient plus d'une centaine de réponses. En revanche, avec les options -e et -s 1 on obtient une dizaine de réponses, en évitant les doublons en français (liés au mot « groupe ») : apropos -e group -s 1gpasswd (1) - administer /etc/group and /etc/gshadow chgrp (1) - change group ownership chgrp (1posix) - change the file group ownership chown (1) - change file owner and group g3topbm (1) - convert a Group 3 fax file into a portable bitmap id (1) - print real and effective user and group IDs newgrp (1) - log in to a new group newgrp (1posix) - change to a new group pbmtog3 (1) - convert a portable bitmap into a Group 3 fax file runuser (1) - run a command with substitute user and group ID sg (1) - execute command as different group ID su (1) - run a command with substitute user and group ID systemd-cgls (1) - Recursively show control group contents
Manipulations de fichiers
Généralités sur le système de fichiers
Au chapitre S1‑I , on a dressé un panorama du système de fichiers de Linux, qui forme un arbre avec une racine unique.
Avoir une bonne connaissance de cet arbre est nécessaire pour tout administrateur, afin qu'il puisse effectuer des manipulations usuelles de fichiers et de répertoires : création, copie, déplacement, suppression, etc.
Ces manipulations sont exécutables dans le shell via des commandes qui prennent pour argument un ou plusieurs chemins, chacun ciblant sans ambiguïté un fichier ou un répertoire dans l'arbre.
On considère comme admise la notion de chemin, qui vient de la théorie des graphes . Dans le cas d'un système de fichiers, l'existence d'un chemin repose sur d'évidentes contraintes de parentalité entre les répertoires successifs parcourus.
Le nommage des fichiers
Sur une partition EXT4, les noms de fichiers sont implémentés par des chaînes de caractères de taille 255 octets maximum.
L'interprétation d'un nom de fichier, c'est‑à‑dire les caractères affichés dépend des paramètres régionaux d'encodage des caractères en vigueur dans l'interface (shell, fenêtre de navigation, etc.).
Par défaut, Linux utilise le format d'encodage UTF‑8 (cf. chap. C3‑IX ) ce qui, a priori, permet d'utiliser tous les caractères existants de toutes les langues (lettres accentués, alphabet grec, etc.) dans les noms de fichiers.
Néanmoins des contraintes existent :
- Deux caractères sont interdits :
-
/car il est le séparateur de noms dans les chemins (cf. infra ) ; il serait donc interprété comme tel par les commandes du shell et « couperait » donc en deux parties tout nom de fichier qui l'utiliserait ; -
\0(code UTF‑80x0) car il est le marqueur de fin des chaîne de style C (cf. chap. C2‑VII ) qui étaient historiquement utilisées par Unix pour stocker les noms de fichiers. - Certains caractères posent des problèmes d'interprétation pour les commandes du shell et sont donc fortement déconseillés :
- tous les caractères servant à l'expression des jokers, à savoir
* ? ! [ ] { } \– cf. infra - les caractères de contrôle
\n(newline)\t(tabulation) ; - les séparateurs et les symboles des opérateurs du shell, typiquement
, () & |. - Enfin, même si la pratique est courante sur d'autres systèmes comme Windows, il est déconseillé d'employer le caractère espace (code UTF‑8
0x20) dans les noms de fichier, car cela complique l'écriture des scripts pour les manipuler.
- La taille maximale effectivement autorisée pour un nom de fichier et un chemin peuvent être affichées dans un terminal respectivement via les commandes ci‑dessous :
- D'une manière générale, il est préférable de donner des noms de dossiers et de fichiers aussi courts que possibles, mais suffisamment explicites pour se faire une précise de leur contenu. La problématique est un peu la même que pour le choix des identificateurs en programmation C, avec néanmoins plus de souplesse puisque le jeu de caractères utilisable est nettement plus vaste.
getconf NAME_MAX /255getconf PATH_MAX /4096
255 et 4096 caractères occupent respectivement environ 4 et 50 lignes d'une fenêtre de largeur 80 caractères). Les extensions des noms de fichiers
Contrairement à Windows, un système Linux ne fait presque aucune distinction de ce que l'on appelle traditionnellement l'extension d'un nom de fichier, c'est‑à‑dire la sous‑chaîne de caractères la plus à droite, séparée du reste du nom par le dernier point, et qui fait partie intégrante du nom.
Néanmoins, tout est dans le « presque » (cf. par exemple le cas des fichiers cachés ci‑après, même s'il ne s'agit pas à proprement parler d'extensions) ; et par ailleurs, les applications s'exécutant sous Linux utilisent les extensions pour automatiser leurs traitements.
Pour toutes les raisons évoquées ci‑dessus, et pour des raisons évidente d'interopérabilité des fichiers (le fait de pouvoir les utiliser sur un autre système), il est vivement recommandé de respecter les conventions d'extension lors du nommage des fichiers.
Fichiers et répertoires cachés
Les fichiers et répertoires dont le nom commence par un point . ne sont pas traités par défaut par certaines commandes, notamment ls, cp, mv, rm, etc. ainsi que find. Ils sont dits « cachés ».
En règle générale, il faut coder l'option -a (comme all) afin qu'ils soient traités par ces commandes.
L'intérêt de cacher des fichiers n'est pas de garder des données secrètes mais d'alléger l'affichage du contenu des répertoires avec des fichiers et dossiers dont le rôle est purement technique et dont la consultation ou la modification relève d'un usage expert du système.
Dans le répertoire maison d'un utilisateur, on peut compter plusieurs dizaines de répertoires cachés (cela dépend des applications installées). Il y a notamment .config, .cache, .local. On le constate en saisissant la commande :
ls -a ~
Les métacaractères (wildcards)
Lorsqu'on souhaite exécuter une commande sur plusieurs fichiers ou répertoires, plutôt que de devoir la réitérer pour chacun, on peut recourir dans le codage des chemins à des expressions utilisant des symboles réservés pour former des métacaractères W – on parle aussi de jokers, en anglais wildcards ou globbing patterns.
Lors de l'exécution, une expression contenant des métacaractères fait alors l'objet d'une expansion en plusieurs expressions déclinées avec tous les remplacements possibles des métacaractères par des caractères effectifs compatibles, recherchés parmi les noms de fichiers ou répertoires ciblés par l'expression — ce qu'on appelle le contexte.
Les métacaractères obéissent à une syntaxe complexe avec une combinatoire a priori illimitée, dont il est difficile d'imaginer toutes les possibilités. On se contentera de décrire ci‑dessous les éléments de syntaxe les plus usuels.
de décrire de façon générale, car tout dépend du contexte. Dans le cas d'un shell Bash, on peut notamment utiliser les éléments de syntaxe suivants :| Joker | Expansion |
|---|---|
* |
n'importe quelle (sous‑)chaîne de caractère parmi celles recherchées, même la chaîne vide |
? |
n'importe quel caractère au sein des chaînes recherchées |
[liste] |
n'importe quel caractère au sein des chaînes recherchées, coïncidant avec un de la liste qui se code par une chaîne de caractères avec une syntaxe complexe où :
|
On donne ci‑dessous quelques cas académiques très simples d'emploi des métacaractères, opérant la commande ls (list) au niveau de la racine du système de fichiers Linux.
- Pour lister tous les répertoires de premier niveau :
ls -d /*/ # for the record: all top-level dir/bin/ /cdrom/ /etc/ /lib/ /lib64/ /lost+found/ /mnt/ /proc/ /run/ /snap/ /sys/ /usr/ /boot/ /dev/ /home/ /lib32/ /libx32/ /media/ /opt/ /root/ /sbin/ /srv/ /tmp/ /var/
ls -d /s*/ # level dir begining whith "s"/sbin/ /snap/ /srv/ /sys/
ls -d /s??/ # level 3-letters dir begining whith 's'/sbin/ /snap/ /srv/ /sys/
ls -d /[ms]*/ # top-level dir begining whith 's' or 'm'/sbin/ /snap/ /srv/ /sys/
- Pour plus de détails sur les possibilités offertes par les métacaractères, on pourra consulter la page de manuel qui y est consacrée en section 7 via la commande :
- Les métacaractères préfigurent le langage dit des expressions régulières W qui permettent, avec un codage très synthétique de générer une combinatoire potentiellement hyper‑complexe de chaînes de caractères.
man 7 glob # globbing patterns
Les chemins dans l'arborescence
Codage d'un chemin absolu
Un chemin est dit absolu si
Codage d'un chemin relatif
Raccourcis remarquables
Commandes d'information sur les fichiers
Au chapitre S1‑I , on a également cité la maxime : En Linux, tout est fichier, mais néanmoins, les fichiers sont de différents types et pour les manipuler, cette information est essentielle, car certaines manipulations sont spécifiques à tel ou tel type de fichiers.
commande file W
commande stat W
Navigation dans le système de fichiers
répertoire courant : commande pwd W
changement de répertoire courant commande cd W
Création, suppression et déplacement de fichiers & répertoires
Fichiers
Répertoires
Consultation et édition de fichiers
Commandes de consultation
commande cat W
L'éditeur en ligne nano
L'éditeur en ligne vim
Liens durs et liens symboliques
Lien dur
Lien symbolique
Recherche de fichiers & répertoires
L'arbre du système de fichiers Linux est toujours volumineux et ramifié, même avec une installation minimale. Rechercher des fichiers ou des répertoires serait vite très fastidieux si l'on devait parcourir l'arbre en utilisant les commandes cd et ls.
Heureusement, on dispose pour cela de deux commandes très puissantes :
-
findqui est multi‑critère – recherche par nom, taille, date, etc. – mais qui peut se révéler lente ; -
locatequi procède uniquement par nom, mais plus rapidement quefind, par le biais d'une base de données.
Attention : pour effectuer des recherches dans des dossiers, encore faut‑il y disposer des droits d'accès. Pour un simple utilisateur, il faut donc préfixer la commande par sudo à chaque fois que la recherche porte ailleurs que dans son répertoire maison.
La commande find
La commande find W opère :
- de façon récursive pour parcourir la totalité du sous‑arbre passé en premier argument comme chemin de point de départ dans l'arbre du système de fichiers ;
- en recherchant dans ce sous‑arbre tous les fichiers ou répertoires satisfaisant à un ou plusieurs critères de recherche définis via des options et en appliquant éventuellement des opérateurs logiques à ces critères.
Le temps d'exécution de cette commande est d'autant plus long que le sous‑arbre est ramifié et que les critères imposés sont nombreux.
Le codage d'une commande find peut être assez complexe, mais on peut déjà retenir la forme syntaxique suivante pour un usage simple avec un seul critère :
findcheminoptionvaleur
Dans cette forme syntaxique :
- Le chemin code le point de départ de la recherche dans l'arbre du système de fichiers.
- La séquence option valeur code le critère de recherche voulu. Notamment, on peut effectuer une recherche par nom ou chemin d'accès, par type, par taille, ou encore par date de modification, comme cela est décrit avec les options listées ci‑dessous.
-
-namesuivi d'une chaîne de caractères précise le nom du fichier à chercher, avec éventuellement l'usage de jokers (cf. supra ). - Pour chercher à partir de
/usrtous les fichiers ou répertoires nommésgcc-12, on saisit la commande : - Pour chercher à partir de
/usr/share/applicationstous les fichiers ou répertoires commençant par la lettrea, on saisit la commande : -
-typesuivi d'une lettre‑code précisant le type de fichiers à chercher : -
fpour des fichiers simples ; -
dpour des répertoires ; -
lpour des liens. - Pour chercher à partir de
/etc/apttous les répertoires (et sous‑répertoires), on saisit la commande : - Pour chercher à partir de
/usr/lib/locale/fr_FRtous les fichiers ou répertoires qui ne sont pas des liens, on saisit la commande : -
-atimeou-mtimesuivi d'une expression entière signée cible les fichiers qui ont été accédés ou modifiés depuis plus de (+) ou moins de (-) tranches de 24 heures quantifiées par le nombre entier. - Pour chercher à partir répertoire courant tous les fichiers ou répertoires qui ont été modifiées depuis 24 heures, on saisit la commande :
- Pour chercher à partir répertoire courant tous les fichiers ou répertoires qui ont été modifiées depuis plus de 30 jours, on saisit la commande :
- Pour chercher à partir répertoire courant tous les fichiers ou répertoires qui ont été modifiées depuis moins de 3 heures, on saisit la commande :
-
-sizesuivi d'une expression précisant : - en préfixe, par son signe
+ou-si la taille en mémoire doit être respectivement supérieure ou inférieure à la valeur codée ; - par sa valeur entière, la taille dans l'unité codée immédiatement après ;
- en suffixe, par une lettre‑code l'unité d'expression de la taille, respectivement
k,M,Gpour des kilo, méga ou giga octets (sans suffixe, la valeur exprime simplement des octets). - Pour chercher à partir de
~/Téléchargementtous les fichiers de taille supérieure à 100 Mo, on saisit la commande : - Pour chercher à partir de
/usr/sbintous les fichiers de taille comprise entre 1 et 5 Mo, on code la commande :
-path qui permet de spécifier une contrainte sur le chemin d'accès au(x) fichier(s) recherchés.
sudo find /usr -name gcc-12
sudo find /usr/share/applications -name a*
find /etc/apt -type d
sudo find /usr/lib/locale/fr_FR ! -type l
-mmin mais avec une durée exprimée en minutes.
sudo find . -mtime 0
find . -mtime +30
find . -mmin -180
find ~/Téléchargement -size +100M
sudo find /usr/sbin -size +1M -size -5M
Le dernier exemple supra montre que l'on peut combiner plusieurs critères de recherche dans une commande find :
- en codant les séquences option valeur les unes à la suite des autres ;
- et éventuellement :
- en groupant ces séquences avec les délimiteurs
\(et\); - en liant ces séquences avec les opérateurs logiques
!(non)&(et)|(ou) ;
- Parce qu'elle opère pour des fichiers en général, la commande
findpermet également de chercher des commandes qui ne sont pas des primitives du shell, et qui ont donc un fichier exécutable installé dans le système. Il suffit pour cela d'employer l'option-executableen plus d'autres critères de nom ou de type. - La commande
findpermet également d'effectuer des recherches de fichiers sur la base de leur contenu, notamment grâce à la très puissante option-exec. Cette dernière permet d'enchaîner n'importe quelle commande codée après l'option à chaque occurrence positive de la recherche avec les critères précédents – et en particulier, on peut utiliser une commande de filtrage commegrep(cf. chap. S1‑IV ).
/usr tous les fichiers exécutables comportant le motif gcc dans leur nom, on peut saisir la commande : find /usr -name *gcc* -type f ! -type l -executable
/home tous les fichiers sources en langage C utilisant la bibliothèque math, on peut saisir la commande : find /home -name *.c -exec grep "math.h" {} +
-exec doit être utilisée avec précaution dans la mesure où elle peut mobiliser fortement les processeurs de la machine (donc ralentir le fonctionnement du système). La commande locate
La commande locate W effectue des recherches d'une façon complètement différente de celle de find. Elle ne parcourt pas un sous‑arbre de fichiers et répertoires mais une base de données du système de fichiers complet, préalablement construite et régulièrement mise à jour.
Cette technique lui donne l'avantage d'être beaucoup plus rapide que find. En revanche, elle procède par motifs portant seulement sur le nom du fichier (ou son chemin d'accès) et n’accepte pas de multiples critères de recherche.
Attention ! La commande locate n'est pas installée par défaut dans toutes les distributions Linux. Si ce n'est pas le cas, il faut alors procéder à son installation et mettre à jour la base de données des fichiers (cf. infra ), typiquement par les commandes ci‑dessous :
sudo apt install locatesudo updatedb
Le codage d'une commande locate est assez simple, il adopte la forme syntaxique générale suivante :
locateoptionmotif
où le motif est une partie du nom ou du chemin d'accès au(x) fichier(s) à chercher – comme si le motif était implicitement encadré de part et d'autre par des jokers *. Ainsi, tous les fichiers ou chemins comportant ce motif sont listés.
En contre‑partie, il est techniquement difficile de cibler un nom exact de fichier pour limiter les résultats. Mais on peut toujours recourir à une commande de filtrage comme grep (cf. chap. S1‑IV ).
Quant aux options, elles sont relativement peu nombreuses. Les plus usuelles sont les suivantes :
-
-bou--basenamepour axer la recherche seulement sur les noms de fichiers (les répertoires ne sont pas considérés comme des éléments de réponse) ; -
-iou--ignore-casepour ne pas prendre en considération les différences de casse (majuscules/minuscules) ; -
-pou--ignore-spacespour ne pas prendre en considération les espaces et la ponctuation.
Pour rechercher rapidement tous les fichiers comprenant le motif gcc-12 dans leur nom, on peut saisir la commande :
locate -b gcc-12
Cette commande s'exécute beaucoup plus rapidement (quasi instantanément) que celle utilisant find (cf. supra ). En contre‑partie, elle est moins ciblée (elle traite d'autres répertoires que /usr, notamment /var) et produit donc certains résultats peu pertinents.
Néanmoins, il est possible d'affiner le tri de plusieurs manières concurrentes :
- en utilisant un joker avant le motif, pour exprimer que le nom recherché doit se finir par
gcc-12:
locate -b *gcc-12
/usr comme point de départ de la recherche : locate /usr/*gcc-12
grep via l'opérateur de tube | (cf. chap. S1‑IV ) : locate gcc-12 | grep "/gcc-12$"
Mise à jour de la base de donnée.
La base de données des fichiers via laquelle la commande locate effectue ses recherches est par défaut située au chemin :
/var/lib/plocate/plocate.db
Typiquement, elle est automatiquement mise à jour par le système avec une périodicité quotidienne.
Pour que la commande locate puisse trouver des fichiers très récents (créés dans la journée), il est nécessaire de mettre à jour manuellement la base de donnée plocate.db avec la commande :
sudo updatedb