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 / b
Page suivante / précédente.
/motif
Rechercher. n = suivant, N = précédent.
g / G
Début / fin de la page.
q
Quitter.
Sections du manuel
1
Commandes utilisateur (ls, cp…).
5
Formats de fichiers (man 5 crontab, man 5 fstab).
8
Commandes d'administration (man 8 mount).
2 / 3
Appels 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é.
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).
Bash conserve par défaut les 1000 dernières commandes dans ~/.bash_history.
history
Afficher et rappeler les commandes passées
Notations utiles
history
Liste numérotée de l'historique.
!N
Re-exécute la commande numéro N.
!!
Re-exécute la commande précédente.
!$
Le dernier argument de la commande précédente.
!str
La dernière commande commençant par str.
history -c
Vide l'historique courant.
Ctrl+R
Recherche 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ù.
Insertion
Saisie 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
i
Entrer en mode insertion.
Echap
Revenir au mode normal. Le réflexe à acquérir.
:w
Écrire (sauver) le fichier.
:q
Quitter (échoue si modifications non sauvées).
:q!
Quitter sans sauver (en cas de doute, c'est la commande qui sauve la mise).
:wq ou ZZ
Sauver 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 l
Gauche, 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 / G
Début / fin de fichier. 42G = ligne 42.
w / b
Mot suivant / précédent.
x / dd
Supprimer caractère / ligne entière.
yy / p
Copier ligne (yank) / coller après.
u / Ctrl+R
Undo / redo.
/motif
Recherche avant. n = occurrence suivante, N = précédente.
:%s/avant/apres/g
Remplacer 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.
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.
^X
Quitter. Propose de sauver si modifications non enregistrées.
^K / ^U
Couper / coller la ligne courante (cut/uncut).
^W
Where is : rechercher dans le fichier.
^\
Rechercher et remplacer.
^G
Aide complète.
M-U / M-E
Undo / 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).
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.
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
-a
Ajoute (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 N
Intervalle en secondes (défaut : 2).
-d
Surligne les différences entre deux exécutions.
-c
Conserve 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 "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.
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.
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.
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
-d
Crée un répertoire au lieu d'un fichier.
-t
Place dans $TMPDIR ou /tmp.
--suffix=.ext
Ajoute une extension au nom (utile pour des outils qui inspectent le nom).
TEMPLATE
Modèle nominatif : les X finaux sont remplacés par des caractères aléatoires (ex. backup-XXXXXX).
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.
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.
-l
Liste la crontab actuelle (utile pour vérifier ce qui est planifié).
-r
Supprime entièrement la crontab. Attention, pas de confirmation.
-u USER
Cible 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.
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 TIME
Mode interactif : tape les commandes, finit avec Ctrl+D.
at TIME < script.sh
Lit les commandes depuis un fichier.
echo "cmd" | at TIME
Mode pipe, le plus pratique en script.
atq
Liste les jobs en attente.
atrm N
Supprime le job numéro N.
Formats de date acceptés
23:00
Aujourd'hui à 23h, ou demain si déjà passé.
23:00 tomorrow
Demain à 23h.
now + 5 minutes
Dans 5 minutes. Aussi + 2 hours, + 3 days.
noon Friday
Vendredi midi.
09:00 2026-05-15
Date 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.