← Vizion.Blog / Licence / Pratique des machines

Notes de cours. Le texte du cours vient des pads de mon enseignant ; les réponses et les compléments ont été rédigés avec Claude, une IA d'Anthropic, et s'adressent à moi. Dans cette version publique, j'ai retiré l'adresse des pads et reformulé les remarques sur le cours.

Pratique des machines, jour 1 (partie 2)

Flux et redirections

Cours du 14 septembre 2026

Comment lire cette note

Le contenu du cours original est conservé tel quel. Tout ce que j'ai ajouté est dans des encadrés : compléments, précisions et mises en garde. Tu peux ainsi distinguer ce qui vient de ton prof de ce qui vient d'ailleurs — c'est important quand tu réviseras pour un partiel.


1Entrée standard et sortie standard

On appelle entrée standard le flux d'entrée par lequel du texte ou toute autre donnée peut être entré dans un programme, et sortie standard le flux de sortie dans lequel les données sont écrites par le programme.

Dans le terminal, le flux d'entrée (les commandes) est saisi au clavier dans l'invite de commande. Le flux en sortie s'affiche sur l'écran dans la fenêtre du terminal. C'est le cas par exemple du résultat de la commande ls.

Pour plus de commodité dans le traitement du résultat d'une commande, il est possible de rediriger le flux de sortie vers un fichier : au lieu de s'afficher sur l'écran, le résultat de la commande sera écrit dans un fichier.

Il est aussi possible de rediriger le flux de sortie vers une autre commande pour enchaîner les commandes progressivement.

Les opérateurs suivants permettent de rediriger la sortie standard vers :

Complément : les trois flux, pas deux

Complément - il y a un troisième flux que le cours ne mentionne pas

Ton prof parle de deux flux. En réalité tout programme Unix naît avec trois tuyaux branchés dessus. On les appelle des descripteurs de fichier (file descriptors, souvent abrégés fd) et ils sont numérotés.

NuméroNom courtNom françaisPar défaut connecté àSert à
0stdinentrée standardton clavierrecevoir des données
1stdoutsortie standardton écranle résultat normal
2stderrsortie d'erreur standardton écranles messages d'erreur

Pourquoi séparer 1 et 2 alors que les deux s'affichent au même endroit ?

Analogie : imagine une usine. Le tapis roulant qui sort les produits finis, c'est stdout. La sonnerie d'alarme quand une machine casse, c'est stderr. Les deux "sortent" de l'usine et arrivent dans le même hangar, donc de loin tu ne vois pas la différence. Mais le jour où tu veux emballer les produits finis dans des cartons, tu ne veux surtout pas emballer la sonnerie avec.

Concrètement :

Terminal
ls dossier_qui_existe dossier_bidon > resultat.txt

Le contenu du dossier qui existe part dans resultat.txt (c'est stdout, donc c'est lui qui est redirigé). Le message d'erreur, lui, s'affiche quand même à l'écran : il est passé par stderr, que tu n'as pas redirigé.

Pour rediriger les erreurs, on préfixe l'opérateur par le numéro du flux :

Terminal
commande 2> erreurs.txt      # les erreurs dans un fichier
commande 2> /dev/null        # les erreurs à la poubelle
commande > tout.txt 2>&1     # les erreurs rejoignent la sortie normale
commande &> tout.txt         # raccourci bash du précédent

/dev/null est un fichier spécial : tout ce qu'on y écrit disparaît. C'est le trou noir du système. On l'appelle parfois "le puits sans fond".

Subtilité qui piège tout le monde : l'ordre compte

Ces deux lignes ne font pas la même chose :

Terminal
commande > fichier.txt 2>&1     # correct : tout finit dans fichier.txt
commande 2>&1 > fichier.txt     # piège : les erreurs restent à l'écran

Le shell lit de gauche à droite. 2>&1 veut dire "envoie le flux 2 là où pointe actuellement le flux 1". Dans le second cas, au moment où il lit 2>&1, le flux 1 pointe encore vers l'écran. Il copie donc cette destination-là. La redirection vers le fichier arrive après, et ne concerne plus que le flux 1.

Analogie : c'est comme dire à quelqu'un "suis la même voiture que Paul" avant que Paul ait changé de voiture. Il suivra l'ancienne.

Complément : > contre >>, et pourquoi c'est dangereux

Attention - > détruit sans prévenir

> ne fait pas qu'écrire dans le fichier : il le vide d'abord, intégralement, avant même que la commande ne s'exécute. Il n'y a ni confirmation, ni corbeille, ni annulation.

Le classique qui détruit un fichier :

Terminal
cat mon_fichier.txt > mon_fichier.txt    # mon_fichier.txt est maintenant vide

Le shell vide le fichier avant de lancer cat, qui lit donc... un fichier vide.

Filet de sécurité : tu peux demander à bash de refuser d'écraser un fichier existant.

Terminal
set -o noclobber       # active la protection
echo test > existant.txt   # bash refuse : "cannot overwrite existing file"
echo test >| existant.txt  # >| force l'écrasement quand tu le veux vraiment

Pour rendre ça permanent, on ajoute set -o noclobber dans ~/.bashrc. À toi de voir : certains trouvent ça pénible, mais quand tu travailleras sur des fichiers de config ou des captures réseau, tu seras content de l'avoir.

Complément : le pipe |, l'invention la plus importante d'Unix

Complément - la philosophie derrière le pipe

Le pipe (en français on dit tube) branche la sortie standard d'une commande directement sur l'entrée standard de la suivante. Rien ne passe par le disque, tout transite en mémoire.

Terminal
ls -l | grep ".txt" | wc -l

Traduction ligne à ligne :

  1. ls -l produit la liste détaillée des fichiers
  2. grep ".txt" reçoit cette liste et ne garde que les lignes contenant .txt
  3. wc -l reçoit ces lignes et les compte (wc = word count, -l = lines)

Résultat : le nombre de fichiers .txt du dossier.

L'analogie de la chaîne de montage. Chaque commande Unix est un ouvrier spécialisé qui sait faire une seule chose, mais parfaitement. grep filtre. sort trie. wc compte. cut découpe des colonnes. Aucun ne sait tout faire, et c'est volontaire. Le pipe, c'est le tapis roulant qui les relie. La puissance ne vient pas des ouvriers, elle vient du fait qu'on peut les assembler dans n'importe quel ordre.

C'est la philosophie Unix, formulée par Doug McIlroy en 1978 : écris des programmes qui font une chose et la font bien ; écris des programmes qui travaillent ensemble ; écris des programmes qui manipulent du texte, parce que le texte est une interface universelle.

Retiens bien ce dernier point. Si toutes les commandes échangent du texte brut, alors n'importe laquelle peut parler à n'importe quelle autre. C'est exactement pour ça que le terminal reste plus puissant qu'une interface graphique quarante ans après : dans une interface graphique, tu ne peux faire que ce que le développeur a prévu comme bouton.

La commande qui manque au cours : tee

Problème : commande > fichier.txt écrit dans le fichier, mais tu ne vois plus rien à l'écran. Parfois tu veux les deux. tee fait exactement ça — son nom vient du raccord de plomberie en T qui sépare un tuyau en deux.

Terminal
ls -l | tee liste.txt        # affiche ET enregistre
ls -l | tee -a liste.txt     # -a pour append (concaténer), comme >>

2Créer un fichier vide

2.1 Sans l'ouvrir

À faire

Ma réponse
Terminal
man touch          # q pour quitter le manuel, / pour chercher dedans
touch fichier_touch.txt
ls

Complément - man, le réflexe à installer maintenant

man = manual. C'est la documentation officielle, installée sur ta machine, qui fonctionne sans internet. Dans un manuel :

ToucheEffet
Espacepage suivante
flèchesligne par ligne
/motchercher "mot" dans la page
noccurrence suivante de la recherche
qquitter

Les manuels sont découpés en sections numérotées. man 1 printf te donne la commande shell, man 3 printf la fonction du langage C. D'où les notations que tu croiseras dans la doc, du type open(2).

Si le manuel est trop dense, commande --help donne souvent un résumé d'une page. Et apropos redirection cherche par mot-clé quand tu ne connais pas le nom de la commande.

Prends l'habitude de lire man avant de chercher sur internet. Ça te paraîtra lent au début, puis ça deviendra plus rapide qu'ouvrir un navigateur. Et le jour où tu seras sur une machine distante sans interface graphique, tu n'auras que ça.

2.2 Avec un éditeur de texte

Il existe de nombreux éditeurs de texte, avec ou sans interface graphique.

Question du cours

Que veut dire « GUI » ?

Ma réponse

GUI = Graphical User Interface, en français interface graphique utilisateur. C'est tout ce qui se manipule à la souris : fenêtres, boutons, menus, icônes.

Son opposé est la CLI = Command Line Interface, interface en ligne de commande : on tape du texte, la machine répond du texte.

On croise aussi TUI = Text User Interface : une interface qui dessine des menus et des cadres, mais uniquement avec des caractères, dans le terminal. htop ou nano en sont des exemples.

Ces logiciels peuvent tous être utilisés pour ouvrir ou créer un fichier avec la commande :

Terminal
[text-editor] [path-to-file]

La commande editor ouvre un éditeur de texte par défaut.

À faire

Ma réponse
Terminal
which editor              # /usr/bin/editor
ls -l /usr/bin/editor     # montre que c'est un lien symbolique
update-alternatives --display editor   # montre vers quoi il pointe vraiment
echo $EDITOR              # la variable d'environnement (souvent vide au début)

Spécifique à ta machine (Debian 13, bureau KDE)

Le cours a été écrit pour les machines de la fac, qui tournent sous Ubuntu 24.04 avec GNOME. Ton portable est sous Debian 13 avec KDE. Deux conséquences concrètes :

  1. gedit n'est probablement pas installé chez toi. C'est l'éditeur graphique historique de GNOME. Sous KDE, l'équivalent est kate (complet) ou kwrite (allégé). Vérifie avant de t'énerver sur un command not found :
    Terminal
    which gedit kate kwrite

    Tu peux installer gedit si tu veux suivre le TP à la lettre (sudo apt install gedit), mais ce n'est pas nécessaire : remplace simplement gedit par kate dans toutes les commandes du TP.

  1. Sur Debian, editor est un lien symbolique, c'est-à-dire un raccourci qui pointe vers un autre fichier. Il est géré par un système appelé update-alternatives, et il pointe par défaut vers nano. Pour changer :
    Terminal
    sudo update-alternatives --config editor

    C'est ce mécanisme qui fait que sudo crontab -e ou git commit (sans -m) ouvrent nano et pas autre chose.

Conseil pour la suite de ta licence

Apprends nano cette semaine (30 minutes suffisent, les raccourcis sont affichés en bas de l'écran, ^X signifie Ctrl+X). Puis, sans te presser, commence vim : tape vimtutor dans un terminal, c'est un tutoriel interactif de 25 minutes livré avec vim.

Pourquoi vim alors que tu as VS Code ? Parce que le jour où tu es connecté en SSH sur un serveur distant ou dans un conteneur Docker minimal, il n'y a pas de VS Code. Il y a vim, ou parfois rien d'autre. Ce n'est pas une question de goût, c'est une question de savoir travailler partout. Tu n'as pas besoin d'être bon, tu as besoin de savoir ouvrir, modifier, sauver, quitter.

2.3 Programmes graphiques et l'opérateur &

Attention : programme GUI et utilisation de &

Lorsque tu utilises une commande qui ouvre un programme muni d'une interface graphique, tu dois utiliser l'opérateur & qui permet de lancer le programme en arrière-plan.

Explication du cours : lorsque tu lances une commande, tu ne peux récupérer l'accès à ton prompt qu'une fois celle-ci terminée. Or, si tu lances un programme avec interface graphique, la commande ne sera considérée comme terminée que lorsque tu auras fermé le programme. Entre-temps, ton terminal sera inutilisable car tu n'as plus accès au prompt.

À faire

Exécute la commande suivante :

Terminal
while true; do echo "coucou" ; sleep 2 ; done

Que se passe-t-il ? Exécute Ctrl-C dans le terminal : tu viens d'interrompre la commande.

Essaie ensuite d'ouvrir un éditeur de texte graphique :

Terminal
gedit
Ma réponse

La boucle affiche coucou toutes les 2 secondes, indéfiniment. Le prompt ne revient jamais : le shell attend la fin de la commande, et cette commande n'a pas de fin. Ctrl-C l'interrompt et rend le prompt.

(Sous KDE, remplacer gedit par kate.)

Complément - décortiquer while true; do ... done

C'est ta première boucle shell. Mot à mot :

ÉlémentRôle
whiletant que (la condition est vraie)
trueune commande qui ne fait rien à part réussir, toujours
;séparateur : équivaut à passer à la ligne
dodébut du bloc à répéter
echo "coucou"affiche coucou
sleep 2attend 2 secondes
donefin du bloc

while true est donc une boucle dont la condition est vraie par construction : une boucle infinie. En Python, tu écrirais exactement la même chose :

Python
import time
while True:
    print("coucou")
    time.sleep(2)

Note la différence de syntaxe : le shell délimite ses blocs par des mots-clés (do / done), Python par l'indentation. Même logique, deux habillages.

L'éditeur s'ouvre, mais si tu reviens sur le terminal, tu n'as plus accès au prompt.

Pour conserver l'accès à ton terminal, tu dois utiliser l'opérateur &.

Terminal
gedit fichier_gedit.txt &

Précision - ce que fait vraiment &

1. & ne lance pas la commande dans un autre shell. Il la lance comme un job en arrière-plan (background job) du shell courant : le shell la démarre, puis n'attend pas sa fin et te rend immédiatement le prompt. Le processus reste rattaché à ton shell, ce qui a une conséquence pratique importante : si tu fermes le terminal, le programme meurt avec lui (il reçoit un signal SIGHUP, hang up). Pour qu'il survive, il faut nohup commande & ou disown après coup.

2. Après un &, Ctrl-C ne ferme pas la fenêtre. Ctrl-C envoie le signal d'interruption au processus au premier plan (foreground) uniquement. Un job lancé avec & est justement en arrière-plan, donc il n'est pas concerné : ta fenêtre kate restera ouverte. C'est sans & que Ctrl-C ferme la fenêtre.

Teste toi-même, c'est en deux commandes.

Complément - gérer les jobs, et les trois raccourcis à ne pas confondre

Commandes de gestion des jobs :

Terminal
jobs          # liste les jobs du shell courant
fg %1         # ramène le job 1 au premier plan (foreground)
bg %1         # relance le job 1 en arrière-plan (background)
kill %1       # termine le job 1
nohup cmd &   # lance en arrière-plan ET survit à la fermeture du terminal

Et surtout, trois raccourcis que tout le monde confond au début :

RaccourciNom techniqueCe que ça fait réellement
Ctrl+Csignal SIGINTdemande poliment au programme de s'arrêter. Le programme peut refuser ou faire du ménage avant.
Ctrl+Zsignal SIGTSTPmet en pause (suspend). Le programme est gelé, pas tué. fg le réveille.
Ctrl+Dpas un signalenvoie une fin de fichier (EOF, end of file) sur l'entrée standard.

La troisième ligne mérite un développement, parce qu'on lit souvent que Ctrl+D « arrête le processus en cours », ce qui est trompeur.

Ctrl+D ne tue rien. Il dit au programme : "l'entrée standard est terminée, il n'y aura plus rien à lire". Si le programme en question est ton shell, un shell qui n'a plus rien à lire n'a plus de raison d'exister, donc il se ferme — d'où l'impression qu'il "ferme le terminal". Mais la cause est différente.

Vérifie la différence en deux essais :

Terminal
cat               # sans argument : cat lit ton clavier et le recopie
# tape du texte, puis Entrée : il te le répète
# Ctrl+D : cat se termine proprement, tu as "fermé le robinet"

cat
# Ctrl+C : cat est interrompu de force

Même résultat apparent, deux mécanismes opposés. Cette distinction te servira beaucoup plus tard que tu ne le crois : elle est au cœur de la façon dont les programmes s'enchaînent dans un pipe.

2.4 Avec la redirection en sortie

La redirection de sortie permet également de créer un fichier.

À faire

Teste les commandes suivantes et explique ce qui se passe. À quoi sert la commande cat ?

Terminal
echo "ligne 1"
echo "ligne 1" > sortie.txt
cat sortie.txt
echo "ligne 1" >> sortie.txt
cat sortie.txt
echo "ligne 2" >> sortie.txt
cat sortie.txt
echo "ligne 3" > sortie.txt
cat sortie.txt
Ma réponse - déroulé complet
#CommandeEffet sur sortie.txtAffichage écran
1echo "ligne 1"aucun (pas de redirection)ligne 1
2echo "ligne 1" > sortie.txtcrée le fichier, contenu : ligne 1rien
3cat sortie.txt—ligne 1
4echo "ligne 1" >> sortie.txtajoute à la finrien
5cat sortie.txt—ligne 1 / ligne 1
6echo "ligne 2" >> sortie.txtajoute à la finrien
7cat sortie.txt—ligne 1 / ligne 1 / ligne 2
8echo "ligne 3" > sortie.txtvide tout, écrit ligne 3rien
9cat sortie.txt—ligne 3

La leçon est à l'étape 8 : trois lignes de travail effacées par un seul chevron, sans avertissement. C'est exactement l'intérêt pédagogique de cet exercice.

Complément - à quoi sert vraiment cat

cat vient de concatenate, concaténer : mettre bout à bout. Sa fonction première n'est pas d'afficher un fichier, c'est de coller plusieurs fichiers en un seul flux :

Terminal
cat partie1.txt partie2.txt partie3.txt > complet.txt

L'affichage à l'écran n'est qu'un effet de bord : quand tu écris cat fichier.txt, tu concatènes un seul fichier et le résultat part sur la sortie standard, qui est ton écran par défaut.

Trois choses à savoir en plus :


3Le lien avec ce qui t'intéresse (sécurité)

Ajout personnel - pourquoi ce cours banal est en fait central

Tu apprends à rediriger des flux dans un TP d'introduction. Voici où tu retrouveras exactement la même chose :

C'est le genre de détail qui sépare quelqu'un qui récite des commandes de quelqu'un qui comprend ce qu'il fait.


4Récapitulatif des opérateurs

OpérateurNomEffet
>redirection en écrasementécrit stdout dans un fichier, en le vidant d'abord
>>redirection en concaténationajoute stdout à la fin d'un fichier
<redirection d'entréelit stdin depuis un fichier au lieu du clavier
2>redirection d'erreurécrit stderr dans un fichier
2>&1fusion de fluxenvoie stderr là où pointe stdout
&>redirection totale (bash)raccourci de > fichier 2>&1
|pipe / tubebranche stdout d'une commande sur stdin de la suivante
&arrière-planlance la commande en job d'arrière-plan, rend le prompt
;séparateurenchaîne deux commandes, quoi qu'il arrive
&&et logiquen'exécute la seconde que si la première a réussi
||ou logiquen'exécute la seconde que si la première a échoué

Les trois dernières lignes ne sont pas au programme du TP

Mais tu les croiseras partout. mkdir projet && cd projet : entre dans le dossier seulement s'il a bien été créé. C'est une sécurité élémentaire — avec ;, le cd s'exécuterait même si le mkdir a échoué, et tu travaillerais au mauvais endroit sans t'en rendre compte.


5Auto-test

Réponds à voix haute, sans regarder. Si tu hésites, retourne à la section concernée.

  1. Quels sont les trois flux standard, leurs numéros, et à quoi chacun est connecté par défaut ?
  2. Quelle différence entre commande > f.txt 2>&1 et commande 2>&1 > f.txt ?
  3. Pourquoi cat fichier.txt > fichier.txt détruit le fichier ?
  4. Que fait ls -l | grep txt | wc -l ? Décris ce qui circule dans chaque tuyau.
  5. Ton terminal est bloqué après avoir lancé un programme graphique. Qu'est-ce que tu as oublié, et quelles sont tes deux options pour t'en sortir sans fermer le programme ?
  6. Quelle est la différence exacte entre Ctrl+C, Ctrl+Z et Ctrl+D ?
  7. Un job lancé avec & survit-il à la fermeture du terminal ? Pourquoi, et comment changer ça ?
  8. D'où vient le nom cat et quelle est sa fonction première ?
  9. Pourquoi /dev/null existe-t-il, et dans quel cas l'utiliserais-tu ?
  10. Sous KDE, pourquoi la commande gedit du TP risque-t-elle d'échouer, et par quoi la remplacer ?

6À faire après ce cours

↑