glossaire-linux

Shell et scripts

L'environnement de travail du shell : historique, alias, outils utilitaires pour les pipelines (xargs, tee, watch...), et planification (cron, at).

Aide et documentation

Avant tout moteur de recherche : la doc est déjà sur la machine, exacte pour la version installée. man pour le manuel complet, apropos pour retrouver une commande par mot-clé quand on ignore son nom.

man · apropos · whatis

Lire le manuel d'une commande, et la retrouver par mot-clé

man (manual) affiche la page de manuel d'une commande, d'un appel système ou d'un fichier de configuration. C'est le réflexe numéro un : la réponse exacte, pour la version installée, est déjà là. apropos et whatis interrogent l'index des manuels (construit par mandb) pour retrouver une page quand on ne connaît pas le nom précis.

Navigation dans man (pager less)

Espace / bPage suivante / précédente.
/motifRechercher. n = suivant, N = précédent.
g / GDébut / fin de la page.
qQuitter.

Sections du manuel

1Commandes utilisateur (ls, cp…).
5Formats de fichiers (man 5 crontab, man 5 fstab).
8Commandes d'administration (man 8 mount).
2 / 3Appels système / fonctions de bibliothèque (programmation C).
$ man ls
man 5 crontab        # la section 5 : le FORMAT du fichier
man 8 useradd
Un même nom peut exister dans plusieurs sections : man passwd ouvre la commande (section 1), man 5 passwd le format du fichier /etc/passwd. Préciser le numéro lève l'ambiguïté.
$ apropos partition
fdisk (8)     - manipulate disk partition table
parted (8)    - a partition manipulation program
partprobe (8) - inform the OS of partition table changes
On ignore le nom de la commande mais on connaît le sujet : apropos (= man -k) cherche dans les descriptions courtes de toutes les pages. Une sortie vide signifie souvent qu'il faut (re)construire l'index avec sudo mandb.
$ whatis ssh
man -k '^cron'       # toutes les pages commençant par cron
ssh (1) - OpenSSH remote login client
whatis donne le résumé en une ligne ; man -k (= apropos) accepte une expression régulière.
Pas de page man ? beaucoup d'outils récents documentent surtout via cmd --help (résumé court) ou info cmd (manuel GNU hypertexte). Sur les conteneurs minimaux, les pages man sont souvent retirées pour gagner de la place — --help reste alors le seul recours embarqué.

Voir aussi : which · type Notation des manuels

Environnement

Une variable d'environnement est une valeur héritée par les processus enfants. PATH, HOME, EDITOR, LANG sont les plus structurantes. On les définit pour la session, ou on les rend permanentes via les fichiers de démarrage du shell.

export · env · PATH

Définir, exporter et persister des variables d'environnement

Une affectation simple (VAR=valeur) n'existe que dans le shell courant. export la promeut en variable d'environnement : elle est alors héritée par tous les processus lancés ensuite. env (ou printenv) liste l'environnement. $PATH — la liste des répertoires où le shell cherche les exécutables — est celle qu'on manipule le plus.

$ VAR=bonjour            # variable de shell, locale
echo "$VAR"
export VAR           # devient variable d'environnement
export EDITOR=vim    # déclaration + export en une fois
Tant qu'elle n'est pas exportée, la variable n'est PAS vue par les programmes lancés depuis ce shell — le piège classique quand un outil ne « voit » pas un réglage qu'on vient de poser.
$ echo "$PATH"
export PATH="$HOME/bin:$PATH"
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
Ajouter ~/bin EN TÊTE : un binaire perso y est trouvé avant celui du système (le premier répertoire qui contient la commande gagne). Toujours réinclure $PATH à la fin — sinon on perd l'accès à toutes les commandes système dans ce shell.
$ env
printenv HOME
env -i bash          # shell avec environnement VIDE
env liste l’environnement et printenv NOM une variable. env -i retire les variables héritées, mais un Bash interactif peut en recréer et charger ~/.bashrc ; utiliser env -i bash --noprofile --norc pour un shell de test sans fichiers de démarrage.
Rendre permanent : une variable posée en ligne de commande disparaît à la fermeture du terminal. Pour la persister, l'ajouter dans un fichier de démarrage : ~/.bashrc (shells interactifs, le cas courant), ~/.profile / ~/.bash_profile (shells de login), ou /etc/environment (tous les utilisateurs). Recharger sans rouvrir le terminal avec source ~/.bashrc (ou . ~/.bashrc).

Voir aussi : $VAR alias

Historique

Bash conserve par défaut les 1000 dernières commandes dans ~/.bash_history.

history

Afficher et rappeler les commandes passées

Notations utiles

historyListe numérotée de l'historique.
!NRe-exécute la commande numéro N.
!!Re-exécute la commande précédente.
!$Le dernier argument de la commande précédente.
!strLa dernière commande commençant par str.
history -cVide l'historique courant.
Ctrl+RRecherche interactive dans l'historique.
$ history | grep ssh
Retrouve toutes les sessions SSH récentes.
$ mkdir /etc/projet
mkdir: impossible de créer le répertoire « /etc/projet »: Permission non accordée
Exemple d'échec attendu dans un shell utilisateur sans droits sur /etc. Saisir ensuite la commande suivante dans le même Bash interactif.
$ sudo !!
Dans un Bash interactif avec l'expansion de l'historique active, reprend la commande précédente avec sudo : ici sudo mkdir /etc/projet. Vérifier la commande rappelée avant de l'exécuter.
$ ls /etc/nginx/conf.d
Saisir cette commande puis la suivante dans le même Bash interactif.
$ cd !$
Avec l'expansion de l'historique active, !$ reprend /etc/nginx/conf.d, le dernier argument de la commande précédente.

Alias

Donner un nom court à une commande longue ou paramétrée.

alias

Créer un raccourci de commande

Les alias ne survivent pas à la fermeture du shell. Pour qu'ils soient permanents, ajoutez-les dans ~/.bashrc (ou ~/.zshrc pour Zsh).

$ alias
Sans argument, liste tous les alias définis.
$ alias ll='ls -lah'
Le classique : ll devient un raccourci pour un ls détaillé.
$ alias gst='git status'
alias ..='cd ..'
alias please='sudo'
D'autres exemples typiques. Une fois ajoutés à ~/.bashrc, faites source ~/.bashrc ou rouvrez le terminal.

unalias

Supprimer un alias

$ unalias ll
unalias -a    # supprime TOUS les alias

Éditeurs de texte

Pour éditer une config dans /etc/, écrire un script, modifier un crontab — il faut un éditeur en CLI. Deux familles : vi/vim (universel, installé partout, courbe d'apprentissage abrupte) et nano (immédiat, mais absent d'un système minimal type conteneur ou serveur Alpine).

vi · vim

L'éditeur omniprésent, modal et puissant

vi est un éditeur normalisé par POSIX, mais il peut être absent d’une image minimale ou d’un initramfs. vim ajoute notamment coloration, historique d’annulation et fenêtres multiples. Selon la distribution et les paquets, vi peut être un lien ou une alternative vers Vim, BusyBox vi ou un autre éditeur compatible. Son fonctionnement est modal.

Les trois modes

Normal (au démarrage)Navigation et commandes. Toutes les frappes sont des raccourcis (h j k l = gauche/bas/haut/droite, dd = couper ligne, yy = copier, p = coller). Echap y revient depuis n'importe où.
InsertionSaisie de texte classique. On y entre avec i (avant curseur), a (après), o (nouvelle ligne en dessous), O (au-dessus).
Commande (préfixe :)Sauvegarde, quitter, recherche, remplacement. :w sauve, :q quitte, :wq les deux, :q! quitte sans sauver.

Commandes de survie

iEntrer en mode insertion.
EchapRevenir au mode normal. Le réflexe à acquérir.
:wÉcrire (sauver) le fichier.
:qQuitter (échoue si modifications non sauvées).
:q!Quitter sans sauver (en cas de doute, c'est la commande qui sauve la mise).
:wq ou ZZSauver puis quitter.
:w !sudo tee %Sauver via sudo quand on a ouvert un fichier root sans privilèges (le grand classique).

Navigation et édition (mode normal)

h j k lGauche, bas, haut, droite. Les flèches marchent aussi mais hjkl est plus rapide.
0 / ^ / $Début de ligne / premier non-blanc / fin de ligne.
gg / GDébut / fin de fichier. 42G = ligne 42.
w / bMot suivant / précédent.
x / ddSupprimer caractère / ligne entière.
yy / pCopier ligne (yank) / coller après.
u / Ctrl+RUndo / redo.
/motifRecherche avant. n = occurrence suivante, N = précédente.
:%s/avant/apres/gRemplacer dans tout le fichier (ajouter c pour confirmer chaque fois).
$ vim /etc/ssh/sshd_config
Ouvre un fichier. Démarrage en mode normal : taper i pour insérer, Echap pour sortir, :wq pour sauver et quitter.
$ vim +30 script.sh             # ouvre direct ligne 30
vim -p f1.txt f2.txt f3.txt   # ouvre dans 3 onglets
vim -d ancien.conf nouveau.conf  # mode diff cote a cote
Quelques arguments en ligne de commande à connaître. -d (diff) est un vimdiff incorporé : navigation entre les hunks avec ]c / [c, copie d'un côté à l'autre avec do / dp.
$ vimtutor
vimtutor fr
Tutoriel interactif intégré (≈ 30 min). Le moyen le plus rapide pour acquérir les réflexes — fortement recommandé avant de passer un LPIC-1. Version française disponible.
Configuration minimale : créer ~/.vimrc avec quelques lignes change radicalement l'expérience : syntax on (coloration), set number (numéros de ligne), set expandtab tabstop=4 shiftwidth=4 (indentation cohérente), set incsearch hlsearch (recherche incrémentale). Les distros ont souvent un /etc/vim/vimrc avec déjà ces réglages.
Coincé ? En cas de doute, Échap puis :q! quitte sans sauvegarder. E325 peut signaler une autre session encore active ou un ancien fichier swap : vérifier d’abord qu’aucun éditeur n’utilise le fichier, récupérer les changements avec Recover si nécessaire, puis supprimer seulement un swap devenu inutile.

Voir aussi : nano sed less

nano

Éditeur immédiat, sans modes

nano est un éditeur sans modes : saisir le texte, sauver avec Ctrl+O et quitter avec Ctrl+X. Le signe ^ signifie Ctrl dans les raccourcis. Il peut être absent des installations minimales ; vérifier les éditeurs disponibles, car vi n’y est pas garanti non plus.

Raccourcis (^ = Ctrl, M = Alt/Meta)

^O (Ctrl+O)Write Out : sauve. Confirme le nom de fichier.
^XQuitter. Propose de sauver si modifications non enregistrées.
^K / ^UCouper / coller la ligne courante (cut/uncut).
^WWhere is : rechercher dans le fichier.
^\Rechercher et remplacer.
^GAide complète.
M-U / M-EUndo / redo (sur nano récent).
$ nano /etc/hosts
Ouvre le fichier. Le bandeau du bas montre les raccourcis principaux. Pour sauver : Ctrl+O, Entrée pour confirmer le nom, Ctrl+X pour quitter.
$ nano -w long-fichier.txt   # ne pas couper les longues lignes
nano +50 script.sh         # ouvre direct ligne 50
nano -B fichier            # cree fichier~ en backup avant sauvegarde
Options utiles. -w est important pour éditer un fichier de config dont le wrapping casserait la syntaxe (ex. /etc/apt/sources.list).
Configuration : ~/.nanorc active la coloration et autres options. Recommandations courantes : set tabsize 4, set autoindent, set linenumbers, include "/usr/share/nano/*.nanorc" (charge tous les schémas de coloration disponibles).

Voir aussi : vi · vim cat

Outils utilitaires

Petites commandes essentielles dans les pipelines et scripts.

xargs

Construire et exécuter des commandes à partir d'une entrée standard

Beaucoup de commandes (rm, cp, echo…) prennent leurs arguments en paramètres, pas via stdin. xargs sert de pont : il transforme une liste de lignes en arguments.

Options

-I {}Remplace {} par chaque entrée. Utile pour les commandes complexes.
-n NMaximum N arguments par appel.
-P NExécute jusqu'à N commandes en parallèle.
-0Sépare par \0 (à coupler avec find -print0).
$ find . -type f -name "*.tmp" -print0 | xargs -0 -r rm --
Supprime tous les fichiers .tmp trouvés, y compris ceux dont le nom contient des espaces ou des retours à la ligne. Les arguments sont groupés.
$ find . -type f -name "*.jpg" -print0 | xargs -0 -r -I {} cp -n -- {} ~/photos/
Robuste face aux noms avec espaces grâce à -print0 + -0.
$ xargs -r -P 4 -n 1 curl -fLO -- < urls.txt
Lance jusqu’à quatre téléchargements simultanés. Ce format suppose une URL par argument, sans espaces ni guillemets bruts ; -r évite un appel sur une liste vide. -f détecte les erreurs HTTP et -L suit les redirections. Des URL de même nom final peuvent écraser le même fichier : prévoir des destinations distinctes si nécessaire.

tee

Dupliquer la sortie : afficher ET écrire dans un fichier

tee lit son entrée standard et l'envoie à la fois sur la sortie standard et dans des fichiers. Très utile pour conserver la trace d'une commande tout en la voyant défiler.

Options

-aAjoute (append) au fichier au lieu de l'écraser.
$ make 2>&1 | tee build.log
Compilation : on voit la sortie en direct, et tout est sauvegardé pour analyse.
$ echo "deb https://example.com/repo stable main" | sudo tee /etc/apt/sources.list.d/repo.list
Astuce classique : écrire dans un fichier protégé sans avoir à sudo tout le pipeline. sudo > ne fonctionne pas, sudo tee oui.

watch

Exécuter une commande à intervalles réguliers

Options

-n NIntervalle en secondes (défaut : 2).
-dSurligne les différences entre deux exécutions.
-cConserve les couleurs de la commande surveillée.
$ watch -d df -h
Surveille l'occupation des disques en surlignant les valeurs qui changent.
$ watch -n 5 'systemctl is-active nginx'
Vérifie toutes les 5 secondes que nginx tourne. Quitter avec Ctrl+C.

echo

Afficher du texte sur la sortie standard

Options

-nPas de saut de ligne final.
-eActive les séquences d'échappement (\n, \t…).
$ echo "Bonjour"
echo "Mon home : $HOME"
echo "Date : $(date +%F)"
$ echo -e "ligne 1\nligne 2\tcolonne"
Avec -e, les séquences sont interprétées.
$ echo "192.168.1.10 db.local" | sudo tee -a /etc/hosts
Pattern pour écrire dans un fichier protégé. sudo echo "..." >> /etc/hosts ne marche pas : la redirection >> est évaluée par le shell avant que sudo ne s'exécute, donc avec les droits courants. tee -a (append) fait l'écriture à l'intérieur du sudo, donc avec les droits root.
Astuce : pour des sorties plus prédictibles entre shells, utilisez printf qui se comporte comme la fonction C : printf '%s\n' "Bonjour".

which · command -v · type

Localiser un binaire / résoudre une commande

which n’est pas normalisé par POSIX et son comportement dépend de l’implémentation et des wrappers du shell ; il recherche généralement dans PATH et peut parfois connaître des alias ou fonctions. type décrit la commande vue par Bash ; command -v est la forme POSIX à privilégier dans un script.

$ which python3
/usr/bin/python3
Cherche python3 selon l’implémentation de which. Pour connaître exactement la résolution du shell courant, préférer type python3 ou command -v python3 ; ne pas supposer que toutes les variantes de which traitent les alias de la même manière.
$ type ll
type cd
type python3
ll is aliased to `ls -lah'
cd is a shell builtin
python3 is /usr/bin/python3
type dit la nature de la commande : alias, builtin, fonction, ou fichier. C'est l'outil de diagnostic à privilégier en interactif.
$ command -v docker >/dev/null || { echo "docker absent"; exit 1; }
Idiome script « refuser de démarrer si X n'est pas installé ». command -v est POSIX, marche partout, sortie clean (chemin ou rien). À préférer à which dans les scripts portables.

Voir aussi : alias time

time

Mesurer le temps d'exécution d'une commande

Mesure le temps écoulé (real) et les temps CPU utilisateur et noyau (user, sys). Dans Bash, time est un mot-clé réservé capable de mesurer des pipelines ; /usr/bin/time est un programme externe dont l’option GNU -v fournit notamment la mémoire résidente maximale.

$ time make
real    0m12.345s
user    0m45.123s
sys     0m2.456s
user + sys > real ? La commande utilise plusieurs CPUs en parallèle. real > somme des deux ? Elle attend (I/O, locks, sleep).
$ /usr/bin/time -v ./mon-prog
Elapsed (wall clock) time: 0:08.23
Maximum resident set size (kbytes): 152300
Major (requiring I/O) page faults: 4
Voluntary context switches: 1283
...
Mode verbeux -v. Donne notamment la RSS max (mémoire physique consommée au pic) — alternative légère à valgrind --tool=massif pour un premier coup d'œil. Penser à utiliser le chemin complet pour ne pas tomber sur le builtin.
$ for i in {1..5}; do time curl -s https://api.example.test >/dev/null; done 2>&1 | grep real
Boucle de mini-benchmark. Pour quelque chose de plus sérieux, utiliser hyperfine qui fait des passes warm-up et de la statistique.

Voir aussi : watch vmstat

mktemp

Créer un fichier ou répertoire temporaire de manière sûre

mktemp crée un fichier (ou répertoire avec -d) avec un nom aléatoire dans /tmp. Plus sûr que /tmp/myfile.$$ qui est prévisible et peut ouvrir une race condition exploitable.

Options

-dCrée un répertoire au lieu d'un fichier.
-tPlace dans $TMPDIR ou /tmp.
--suffix=.extAjoute une extension au nom (utile pour des outils qui inspectent le nom).
TEMPLATEModèle nominatif : les X finaux sont remplacés par des caractères aléatoires (ex. backup-XXXXXX).
$ tmp=$(mktemp)
echo "données" > "$tmp"
rm "$tmp"
Cycle minimal. $tmp ressemble à /tmp/tmp.AbC123.
$ dir=$(mktemp -d) || exit 1
trap 'rm -rf -- "$dir"' EXIT
trap 'exit 130' INT
trap 'exit 143' TERM
trap 'exit 129' HUP
# ... le script utilise $dir ...
Crée le répertoire puis installe son nettoyage à la sortie, avec INT/TERM/HUP convertis en sorties explicites. SIGKILL ou un arrêt brutal de la machine ne permettent pas de garantir le nettoyage. Voir aussi trap.
$ mktemp /tmp/build-XXXXXX.log
Avec un template, on garde un préfixe lisible et on choisit l'extension. Pratique si plusieurs scripts laissent des temporaires côte à côte.

Voir aussi : trap touch

Planification

Exécuter une commande à heure fixe, périodiquement ou au démarrage : cron est l'outil historique, disponible partout. Sur une machine systemd moderne, les timers systemd offrent une alternative avec journalisation intégrée.

crontab

Programmer des commandes périodiques (cron)

cron est le démon ; crontab la commande qui édite la table des jobs d'un utilisateur. Chaque ligne décrit quand (cinq champs temporels) et quoi (la commande à exécuter). Les tables sont utilisateur-spécifiques.

Options

-eÉdite la crontab de l'utilisateur dans $EDITOR. C'est la voie normale.
-lListe la crontab actuelle (utile pour vérifier ce qui est planifié).
-rSupprime entièrement la crontab. Attention, pas de confirmation.
-u USERCible un autre utilisateur (réservé à root).

Syntaxe

┌──────── minute        (0-59)
│ ┌────── heure         (0-23)
│ │ ┌──── jour du mois  (1-31)
│ │ │ ┌── mois           (1-12)
│ │ │ │ ┌ jour semaine   (0-7, dimanche = 0 ou 7)
│ │ │ │ │
* * * * * commande à exécuter

# Raccourcis (selon implémentation) :
@reboot     /chemin/vers/script.sh    # une fois au démarrage
@hourly     /chemin/vers/script.sh    # equivalent : 0 * * * *
@daily      /chemin/vers/script.sh    # equivalent : 0 0 * * *
@weekly     /chemin/vers/script.sh    # equivalent : 0 0 * * 0
$ crontab -e
# Sauvegarde tous les jours à 3h15
15 3 * * * /home/dev/bin/backup.sh

# Toutes les 5 minutes en heures de bureau (lundi à vendredi)
*/5 9-18 * * 1-5 /home/dev/bin/health-check.sh

# Premier dimanche du mois à 6h
0 6 1-7 * * test "$(date +\%u)" = "7" && /home/dev/bin/maintenance.sh
Ouvre l'éditeur sur la crontab. Quelques patterns classiques. Le % doit être échappé en \% dans une crontab — non échappé, il agit comme un saut de ligne dans la commande, ce qui casse souvent.
$ crontab -l
Affiche la crontab actuelle. Premier réflexe quand on hérite d'un serveur : voir ce qui tourne en automatique.
Pièges classiques :
  • Cron définit généralement HOME et LOGNAME depuis le compte et utilise /bin/sh, avec un PATH limité ; il ne charge pas les fichiers de démarrage interactifs de Bash.
  • Les sorties non redirigées peuvent être envoyées par mail si le système le permet (MTA et MAILTO). Choisir un fichier de log accessible à l’utilisateur de la tâche.
  • Pour approcher ce contexte : env -i HOME="$HOME" PATH=/usr/bin:/bin /bin/sh -c 'commande'. Vérifier aussi le répertoire courant et les variables réellement définies par cron.
Alternative systemd : Un timer systemd peut déclencher un service avec journalisation et dépendances ; Persistent=true rattrape certaines échéances manquées. Une relance après échec n’est pas automatique par le seul timer : configurer explicitement la politique du service si nécessaire.

Voir aussi : systemd timers systemctl date nohup

at

Planifier une commande pour une exécution unique

at est le pendant ponctuel de cron : on lui donne une date/heure et un script, il l'exécute une seule fois puis oublie. Idéal pour « lance ce déploiement à 2h du matin une fois » sans avoir à modifier la crontab.

Commandes liées

at TIMEMode interactif : tape les commandes, finit avec Ctrl+D.
at TIME < script.shLit les commandes depuis un fichier.
echo "cmd" | at TIMEMode pipe, le plus pratique en script.
atqListe les jobs en attente.
atrm NSupprime le job numéro N.

Formats de date acceptés

23:00Aujourd'hui à 23h, ou demain si déjà passé.
23:00 tomorrowDemain à 23h.
now + 5 minutesDans 5 minutes. Aussi + 2 hours, + 3 days.
noon FridayVendredi midi.
09:00 2026-05-15Date absolue.
$ echo "rsync -av /src/ user@host:/dst/" | at 02:00 tomorrow
Programme un rsync pour 2h du matin demain. Pas besoin d'éditer la crontab pour un job ponctuel.
# printf '%s\n' 'systemctl restart nginx' | at now + 30 minutes
job 42 at 2026-05-07 18:30:00
À exécuter dans un shell root : programme le redémarrage de nginx dans 30 minutes sans invite interactive. La tâche est enregistrée pour root, ce qui évite de demander un mot de passe sudo lors de son exécution différée. Le service atd doit être actif.
$ atq
atrm 42
Liste les jobs et annule le job 42.
Pas installé par défaut sur beaucoup de distros minimales : paquet at sur Debian/Ubuntu et Fedora, et il faut activer le service avec systemctl enable --now atd sinon les jobs sont bien créés mais jamais exécutés.

Voir aussi : crontab date