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

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
    
    et remet la ligne de commande dans son état précédent (avant tout appui sur la touche TAB).

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º]
    comprises entre le premier nº et le dernier nº optionnellement saisis, sachant que par défaut, seules les 15 dernières commandes sont affichées ;
  • Pour exécuter une commandes de l'historique sélectionnée par son numéro :
  •   	
    fc -s
  • Pour éditer une commandes de l'historique sélectionnée par son numéro :
  •   	
    fc 
    sachant que c'est l'éditeur en ligne par défaut qui est ouvert (typiquement, 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.
    Cette fonctionnalité est très commode pour mettre au point une commande complexe.

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 history
history est une primitive du shell
type rm
rm est /usr/bin/rm
type man
man est haché (/usr/bin/man)
type ll
ll est un alias vers « ls -alF »
type lk
bash: 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 :

	
identificateur option(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).
  • Exemple. Une instruction de compilation en langage C se code typiquement de la forme (cf. chap. C1‑II ) :
    		
    gcc -Wall -Wextra fichier source -o fichier exécutable
  • des opérateurs peuvent être employés ; en particulier, plusieurs commandes peuvent être enchaînées dans une même instructions.
  • Exemple. On peut créer un répertoire et tout de suite après y positionner le répertoire courant en codant :
    		
    mkdir nom du répertoire && cd nom 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 ;
  • on parle alors de forme courte ;
  • soit avec deux tirets initiaux -- et un nom explicite, comme par exemple --help ;
  • on parle alors de forme longue.

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 -test
mkdir : option invalide -- 't' Saisissez « mkdir --help » pour plus d'informations.
mkdir ---test
ls
-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 0 code 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/bin
bash: cd: /us/bin: Aucun fichier ou dossier de ce type
echo $?
1
cb /us/bin
cb : commande introuvable
echo $?
127
cd /usr/bin
echo $?
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 --help et/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 :

  
help nom 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 :

man nom 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 :

  1. Commandes du shell internes et externes
  2. Appels systèmes (API W du noyau, utilisée par les développeurs système)
  3. fonctions de bibliothèques (libC W ou autres)
  4. fichiers spéciaux (/dev/sdX ou 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 pwd
PWD(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 pwd
pwd (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 more W, puis less W (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 most W.

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
  • le paramétrage du pageur par défaut, qui requiert :
    • l'ajout dans le fichier .bashrc (dans le répertoire maison de l'utilisateur) de la ligne ci‑dessous :
    • export PAGER="most"
      
      ce qui peut être fait avec n'importe quel éditeur de code (nano, vim, etc.) ;
    • l'exécution par le système de ce fichier modifié :
    • 	
      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/info
which packettracer # installed
/usr/local/bin/packettracer
which 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 sed
sed: /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 :

  • Le premier chemin est évidemment celui vers l'exécutable, le même qu'on obtiendrait avec les commandes which ou type.
  • Les autres chemins localisent les fichiers d'archives des pages du manuel (version Posix et section 1 – cf. supra ) et de la page de documentation info (cf. supra .

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).

Elle dispose néanmoins d'une documentation externe .

La forme d'emploi usuel de cette commande est :

compgen option motif

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 :

  • -c limite la complétion aux commandes ;
  • -b limite la complétion aux primitives du shell (builtin).

Voici quelques exemples classiques d'utilisation de compgen :

compgen -b # liste de toutes les primitives disponibles
compgen -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 :

  • -e qui impose une occurrence exacte dans la rubrique NAME du ou des motifs passés en arguments ;
  • -a qui impose que tous (all) les motifs passés en arguments soient présents dans la rubrique NAME ;
  • -s qui limite la recherche aux numéros de section du manuel saisis juste après.

  1. Pour trouver des commandes qui opèrent sur la configuration du GRUB (cf. chap. S1‑II ), il n'est pas efficace de saisir :
  2.   
    apropos grub config
    car, le motif « 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 config
    grub-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
  3. Pour trouver des commandes qui opèrent sur les groupes d'utilisateurs (cf. chap. S1‑V ), il n'est pas efficace de saisir :
  4.   
    apropos group
    car, le motif « 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 1
    gpasswd (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‑8 0x0) 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.

  1. 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 :
  2.   
    getconf NAME_MAX /
    255
    getconf PATH_MAX /
    4096
    Ces valeurs sont largement surdimensionnées, même par rapport à des usages exceptionnels (255 et 4096 caractères occupent respectivement environ 4 et 50 lignes d'une fenêtre de largeur 80 caractères).
  3. 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 , avec néanmoins plus de souplesse puisque le jeu de caractères utilisable est nettement plus vaste.

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ù :
  • une liste hétéroclite se code simplement par une chaîne de caractères, sans aucun séparateur, par exemple :
    • PG_b5 pour cibler les caractères P G _ b 5 ;
  • - décrit une liste de caractères consécutifs dans l'encodage en vigueur, typiquement :
    • A-Z pour cibler n'importe quelle lettre latine majuscule ;
    • a-z pour cibler n'importe quelle lettre latine minuscule ;
    • A-Za-z pour cibler n'importe quelle lettre latine ;
    • 0-9 pour cibler n'importe quel chiffre arabe ;
    • etc.
  • ! ou ^ exprime le complément de la liste qui suit parmi tous les caractères possibles, typiquement :
    • !0-9 pour cibler n'importe quel caractère qui n'est pas un chiffre arabe ;

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/
  • Idem mais dont le nom commence par la lettre « s » :
  •   
    ls -d /s*/ # level dir begining whith "s"
    /sbin/ /snap/ /srv/ /sys/
  • Idem mais dont le nom commence par la lettre « s » et fait exactement 3 lettres :
  •   
    ls -d /s??/ # level 3-letters dir begining whith 's'
    /sbin/ /snap/ /srv/ /sys/
  • Idem mais dont le nom commence par la lettre « s » ou la lettre « m » :
  •   
    ls -d /[ms]*/ # top-level dir begining whith 's' or 'm'
    /sbin/ /snap/ /srv/ /sys/

  1. 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 :
  2.   
    man 7 glob # globbing patterns
  3. 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.

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

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

W

Lien symbolique

W

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 :

  • find qui est multi‑critère – recherche par nom, taille, date, etc. – mais qui peut se révéler lente ;
  • locate qui procède uniquement par nom, mais plus rapidement que find, 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 :

find chemin option valeur

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.
    • -name suivi d'une chaîne de caractères précise le nom du fichier à chercher, avec éventuellement l'usage de jokers (cf. supra ).
    • La même syntaxe vaut pour l'option -path qui permet de spécifier une contrainte sur le chemin d'accès au(x) fichier(s) recherchés.

      1. Pour chercher à partir de /usr tous les fichiers ou répertoires nommés gcc-12, on saisit la commande :
      2.       
        sudo find /usr -name gcc-12
      3. Pour chercher à partir de /usr/share/applications tous les fichiers ou répertoires commençant par la lettre a, on saisit la commande :
      4.       
        sudo find /usr/share/applications -name a*
    • -type suivi d'une lettre‑code précisant le type de fichiers à chercher :
      • f pour des fichiers simples ;
      • d pour des répertoires ;
      • l pour des liens.

      1. Pour chercher à partir de /etc/apt tous les répertoires (et sous‑répertoires), on saisit la commande :
      2.       
        find /etc/apt -type d
      3. Pour chercher à partir de /usr/lib/locale/fr_FR tous les fichiers ou répertoires qui ne sont pas des liens, on saisit la commande :
      4.       
        sudo find /usr/lib/locale/fr_FR ! -type l
    • -atime ou -mtime suivi 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.
    • La même syntaxe vaut pour l'option -mmin mais avec une durée exprimée en minutes.

      1. Pour chercher à partir répertoire courant tous les fichiers ou répertoires qui ont été modifiées depuis 24 heures, on saisit la commande :
      2.       
        sudo find . -mtime 0
      3. 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 :
      4.       
        find . -mtime +30
      5. 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 :
      6.       
        find . -mmin -180
    • -size suivi 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 kMG pour des kilo, méga ou giga octets (sans suffixe, la valeur exprime simplement des octets).

      1. Pour chercher à partir de ~/Téléchargement tous les fichiers de taille supérieure à 100 Mo, on saisit la commande :
      2.       
        find ~/Téléchargement -size +100M
      3. Pour chercher à partir de /usr/sbin tous les fichiers de taille comprise entre 1 et 5 Mo, on code la commande :
      4.       
        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) ;
    sachant que plusieurs séquences de suites sont implicitement liées par l'opérateur et.

  1. Parce qu'elle opère pour des fichiers en général, la commande find permet é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 -executable en plus d'autres critères de nom ou de type.
  2. Exemple. Pour chercher à partir de /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
  3. La commande find permet é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 comme grep (cf. chap. S1‑IV ).
  4. Exemple. Pour chercher à partir de /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" {} +
    Attention. Outre le fait qu'elle est assez technique à coder, l'option -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 locate
sudo updatedb

Le codage d'une commande locate est assez simple, il adopte la forme syntaxique générale suivante :

locate option motif

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 :

  • -b ou --basename pour 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) ;
  • -i ou --ignore-case pour ne pas prendre en considération les différences de casse (majuscules/minuscules) ;
  • -p ou --ignore-spaces pour 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
  • en imposant le chemin /usr comme point de départ de la recherche :
  •   
    locate /usr/*gcc-12
  • en combinant avec une commande de filtrage 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