A01

Le Terminal

Shell

Prérequis : aucun

Introduction

Le terminal est une interface texte qui permet de communiquer directement avec le système d'exploitation. Contrairement à une interface graphique où tu cliques sur des icônes et des menus, dans le terminal tu tapes des instructions sous forme de texte et le système te répond en texte.

Pourquoi utiliser le terminal alors qu'on a des interfaces graphiques ? Plusieurs raisons :

  • La puissance : certaines opérations sont impossibles ou très lentes avec une souris. Renommer 500 fichiers, chercher un mot dans 200 fichiers, automatiser une tâche répétitive — le terminal fait ça en une ligne.
  • La précision : une commande fait exactement ce que tu lui dis, rien de plus, rien de moins. Pas d'ambiguïté, pas de "est-ce que tu voulais dire...".
  • L'universalité : les serveurs n'ont pas d'interface graphique. À 42, sur un poste de travail ou un serveur distant, le terminal est toujours là.
  • La composabilité : les commandes Unix sont des briques. Tu peux les combiner entre elles pour créer des opérations complexes. C'est le sujet de la vidéo A03 sur les pipes.
  • La reproductibilité : une commande tapée une fois peut être rejouée à l'identique. Une suite de commandes peut devenir un script. Avec une interface graphique, tu ne peux pas "rejouer" une séquence de clics.

À 42, le terminal c'est ton outil principal. Tu l'utiliseras tous les jours pendant la Piscine et tout le cursus. Les évaluations se font au terminal. La compilation se fait au terminal. Git se fait au terminal. L'éditeur que la plupart des étudiants utilisent (vim) est dans le terminal.

Le prompt

Quand tu ouvres un terminal, tu vois quelque chose comme :

isoulima@c1r1s1:~$

C'est le prompt. Il se décompose ainsi :

  • isoulima — ton nom d'utilisateur (login)
  • c1r1s1 — le nom de la machine (hostname)
  • ~ — le dossier où tu es (~ = ton home)
  • $ — indique que tu es un utilisateur normal (un # indiquerait root, le super-utilisateur)

Le prompt te dit que le terminal attend une commande. Tu tapes ta commande, tu appuies sur Entrée, le système exécute et affiche le résultat en dessous. Puis un nouveau prompt apparaît, prêt pour la commande suivante.

Terminal
echo "Hello 42"
Hello 42
$

Shell

Le programme qui interprète tes commandes s'appelle le shell. C'est lui qui lit ce que tu tapes, comprend quelle commande tu veux exécuter, la lance, et t'affiche le résultat.

Il existe plusieurs shells :

  • bash (Bourne Again Shell) — le plus courant sur Linux
  • zsh (Z Shell) — le shell par défaut sur macOS et souvent utilisé à 42
  • sh — le shell POSIX minimal

Les différences entre bash et zsh sont mineures pour un débutant. Les commandes qu'on va voir fonctionnent dans tous les shells.

Pour savoir quel shell tu utilises :

Terminal
echo $SHELL
/bin/zsh

Le système de fichiers Unix

L'arborescence

Sur Unix (Linux, macOS), tous les fichiers sont organisés dans une arborescence unique. Au sommet il y a la racine, notée / (un simple slash). Tout part de là.

/
├── bin/          ← les programmes système (ls, cp, cat...)
├── etc/          ← les fichiers de configuration
├── home/         ← les dossiers personnels des utilisateurs
│   ├── isoulima/
│   ├── jdupont/
│   └── mmartin/
├── tmp/          ← fichiers temporaires
├── usr/          ← programmes installés
└── var/          ← données variables (logs, bases de données)

Chaque utilisateur a son home directory dans /home/. C'est ton espace personnel — tu peux y créer, modifier et supprimer tout ce que tu veux. Tu ne peux pas toucher aux fichiers des autres utilisateurs ni aux fichiers système (sauf si tu es root).

Chemins

Un chemin (path) c'est l'adresse d'un fichier ou dossier dans l'arborescence. Il existe deux types :

/home/isoulima/Documents/mon_projet/main.c

Ce chemin est valide peu importe où tu es dans le système.

Documents/mon_projet/main.c

Ce chemin n'est valide que si tu es dans /home/isoulima/.

  • . (point) — le dossier courant
  • .. (point point) — le dossier parent (un niveau au-dessus)
  • ~ (tilde) — ton home directory
  • / seul — la racine du système

Fichiers et dossiers

Tout est fichier sur Unix. Un dossier est un fichier spécial qui contient une liste d'autres fichiers. Un fichier texte contient du texte. Un programme contient du code machine. Mais pour le système, ce sont tous des "fichiers".

Se repérer

pwd — Où suis-je ?

Terminal
pwd
/home/isoulima

Le "working directory" c'est le dossier dans lequel le terminal travaille en ce moment. Toutes les commandes s'exécutent par rapport à ce dossier. Si tu fais ls, il liste le contenu du working directory. Si tu crées un fichier, il est créé dans le working directory.

C'est toujours la première commande à taper quand tu es perdu.

La variable $HOME contient le chemin de ton home directory :

Terminal
echo $HOME
/home/isoulima

ls — Lister le contenu

Terminal
ls
Desktop Documents Downloads Music Pictures

Les dossiers et fichiers sont affichés par ordre alphabétique. Sans option, tu ne vois que les noms.

Terminal
ls -l
total 20
drwxr-xr-x 2 isoulima 42staff 4096 Apr 5 09:12 Desktop
drwxr-xr-x 3 isoulima 42staff 4096 Apr 5 10:30 Documents
-rw-r--r-- 1 isoulima 42staff 87 Apr 5 11:00 main.c

Chaque colonne a un sens :

ColonneSignificationExemple
1Type + permissionsdrwxr-xr-x
2Nombre de liens2
3Propriétaireisoulima
4Groupe42staff
5Taille (octets)4096
6Date de modificationApr 5 09:12
7NomDesktop

Le premier caractère indique le type :

  • d = dossier (directory)
  • - = fichier normal
  • l = lien symbolique (raccourci)
Terminal
ls -a
. .. .bashrc .zshrc Desktop Documents Downloads
  • . = le dossier courant (lui-même)
  • .. = le dossier parent
  • .bashrc, .zshrc = fichiers de configuration du shell

La combinaison de -l et -a montre tout en détail. C'est la commande que tu utiliseras le plus souvent.

Terminal
ls -la
total 28
drwxr-xr-x 5 isoulima 42staff 4096 Apr 5 09:12 .
drwxr-xr-x 3 root root 4096 Mar 1 08:00 ..
-rw-r--r-- 1 isoulima 42staff 220 Mar 1 08:00 .bashrc
-rw-r--r-- 1 isoulima 42staff 30 Mar 1 08:00 .zshrc
drwxr-xr-x 2 isoulima 42staff 4096 Apr 5 09:12 Desktop
drwxr-xr-x 3 isoulima 42staff 4096 Apr 5 10:30 Documents
  • ls -R — affiche récursivement le contenu des sous-dossiers
  • ls -t — trie par date de modification (le plus récent en premier)
  • ls -S — trie par taille (le plus gros en premier)
  • ls -h — tailles lisibles (Ko, Mo au lieu d'octets)
  • ls -lh — combo détaillé + tailles lisibles
Terminal
ls Documents/
mon_projet cours.pdf notes.txt
ls -l /etc/
...
Terminal
ls *.c # Tous les fichiers .c
ls ex0?/ # ex00/, ex01/, ex02/... (? = un seul caractère)
ls ex[0-3]*/ # ex00/ à ex03/

Les patterns , ?, [...] s'appellent des globs. C'est le shell qui les interprète, pas la commande ls. Toutes les commandes peuvent les utiliser : rm .o, cat *.c, etc.

Terminal
ls -l
drwxr-xr-x 2 isoulima 42staff 4096 Apr 5 09:12 ex00

La taille 4096 d'un dossier ne représente PAS la taille de son contenu. C'est la taille de la "table des matières" du dossier (la liste des fichiers qu'il contient). Pour connaître la taille réelle d'un dossier et son contenu :

Terminal
du -sh ex00/
12K ex00/

cd — Se déplacer

Terminal
cd Documents
pwd
/home/isoulima/Documents

Tu es maintenant "dans" le dossier Documents. Toutes les commandes s'exécutent maintenant par rapport à ce dossier.

Terminal
cd ..
pwd
/home/isoulima
Terminal
cd ../../ # Remonter de 2 niveaux
Terminal
cd ~
cd # Pareil, sans argument = home
Terminal
cd /
pwd
/
Terminal
cd /home/isoulima/Documents/mon_projet

Ça marche peu importe où tu es.

Terminal
cd ../Downloads

Ça remonte d'un niveau puis entre dans Downloads.

Terminal
cd -

C'est un raccourci très pratique. cd - te ramène au dossier où tu étais avant le dernier cd.

Terminal
cd MonDossier
bash: cd: MonDossier: No such file or directory

Le dossier n'existe pas, ou tu as fait une faute de frappe. Unix est sensible à la casse : Documents et documents sont deux dossiers différents.

Terminal
cd main.c
bash: cd: main.c: Not a directory

Créer

mkdir — Créer un dossier

Terminal
mkdir mon_projet
ls
mon_projet
Terminal
mkdir ex00 ex01 ex02
Terminal
mkdir -p ex00/srcs/utils

Sans -p, la commande échoue si ex00 ou srcs n'existent pas. Avec -p, tous les dossiers intermédiaires sont créés automatiquement.

Terminal
mkdir ex00
mkdir: cannot create directory 'ex00': File exists

Le dossier existe déjà. Ce n'est pas grave, mais la commande te prévient.

touch — Créer un fichier

Terminal
touch main.c
ls -l main.c
-rw-r--r-- 1 isoulima 42staff 0 Apr 5 11:00 main.c

La taille est 0 — le fichier est vide. C'est normal. Tu utiliseras un éditeur de texte (vim, nano, VS Code) pour écrire dedans.

Terminal
touch main.c ft_putchar.c ft_strlen.c Makefile
Terminal
mkdir -p ex00
touch ex00/ft_putchar.c

Copier, déplacer, supprimer

cp — Copier

Terminal
cp main.c backup.c
ls
backup.c main.c
Terminal
cp main.c ex00/
Terminal
cp -r ex00 ex00_backup

Sans -r, la commande refuse de copier un dossier.

Terminal
cp main.c ft_putchar.c ex00/

Le dernier argument doit être un dossier existant.

Terminal
cp ex00 ex01
cp: -r not specified; omitting directory 'ex00'

Tu as oublié -r.

mv — Déplacer et renommer

Terminal
mv main.c ex00/
ls ex00/
main.c
Terminal
mv main.c ft_putchar.c

Déplacer un fichier dans le même dossier avec un nom différent = renommer.

Terminal
mv ex00 exercices/

Pas besoin de -r contrairement à cp. mv ne copie pas, il déplace — c'est juste un changement d'adresse.

Terminal
mv ex00 exercise_00

rm — Supprimer

Terminal
rm backup.c

Pas de confirmation, pas de corbeille. Le fichier est détruit immédiatement.

Terminal
rmdir mon_dossier_vide
Terminal
rm -r ex00_backup

Supprime le dossier et tout ce qu'il contient, y compris les sous-dossiers.

Terminal
rm -rf dossier/

Ne demande aucune confirmation, même si les fichiers sont protégés en écriture.

Pourquoi ? Quand tu supprimes un fichier avec rm, le système ne "efface" pas les données du disque. Il supprime le lien entre le nom du fichier et l'inode (les données). Les données sont toujours sur le disque, mais le système considère cet espace comme "libre" et peut l'écraser à tout moment. Sans outils spécialisés de récupération (et encore, sans garantie), c'est perdu.

  • Toujours vérifier deux fois avant de taper rm -rf
  • Ne JAMAIS faire rm -rf / ou rm -rf ~ — ça détruit tout
  • Utiliser git pour versionner ton code (c'est le sujet de la prochaine vidéo)
  • En cas de doute, ls d'abord pour vérifier ce que tu vas supprimer
  • Utiliser rm -i si tu veux une confirmation pour chaque fichier :
Terminal
rm -i *.c
rm: remove regular file 'main.c'? y
rm: remove regular file 'test.c'? n
Terminal
rm -rv ex00_backup/
removed 'ex00_backup/main.c'
removed directory 'ex00_backup/'
Terminal
rm dossier/
rm: cannot remove 'dossier/': Is a directory

Il faut -r pour un dossier.

Terminal
rm fichier_protege
rm: remove write-protected regular file 'fichier_protege'?

Le fichier est en lecture seule. Tape y pour confirmer ou utilise -f.

Lire des fichiers

cat — Afficher tout

Terminal
cat main.c
#include <unistd.h>
 
void ft_putchar(char c)
{
write(1, &c, 1);
}
Terminal
cat -n main.c
1 #include <unistd.h>
2
3 void ft_putchar(char c)
4 {
5 write(1, &c, 1);
6 }
Terminal
cat fichier1.c fichier2.c

Affiche le contenu des deux fichiers à la suite.

Pour un gros fichier, cat défile trop vite. Dans ce cas, utilise less :

Terminal
less gros_fichier.c
  • Flèches haut/bas pour naviguer
  • Space pour avancer d'une page
  • /mot pour chercher
  • q pour quitter

head — Les premières lignes

Terminal
head main.c # Les 10 premières lignes (défaut)
head -n 3 main.c # Les 3 premières lignes
head -3 main.c # Raccourci, même chose

tail — Les dernières lignes

Terminal
tail main.c # Les 10 dernières lignes
tail -n 5 main.c # Les 5 dernières
tail -5 main.c # Raccourci
Terminal
tail -f /var/log/syslog

less — Naviguer dans un fichier

Terminal
less gros_fichier.c
ToucheAction
/ Monter / descendre d'une ligne
SpaceAvancer d'une page
bReculer d'une page
/motChercher "mot" dans le fichier
nOccurrence suivante
NOccurrence précédente
gAller au début
GAller à la fin
qQuitter

wc — Compter

Terminal
wc main.c
6 10 62 main.c
Terminal
wc -l main.c # Lignes seulement
6 main.c
wc -w main.c # Mots seulement
10 main.c
wc -c main.c # Octets seulement
62 main.c
Terminal
ls | wc -l
5

C'est un aperçu des pipes qu'on verra dans A03 — on prend la sortie de ls et on la passe à wc.

diff — Comparer deux fichiers

Terminal
diff fichier1.c fichier2.c
3c3
< write(1, &c, 1);
---
> write(1, "a", 1);
Terminal
diff -u fichier1.c fichier2.c # Format unifié (plus lisible)

echo — Afficher du texte

Terminal
echo "Hello 42"
Hello 42
echo $HOME # Afficher une variable
/home/isoulima
echo "Mon home est $HOME"
Mon home est /home/isoulima

Avec les redirections (aperçu, détaillé dans A03) :

Terminal
echo "Hello" > fichier.txt # Écrire dans un fichier (écrase)
echo "World" >> fichier.txt # Ajouter à la fin du fichier
cat fichier.txt
Hello
World

Les permissions

Pourquoi les permissions existent

Unix est un système multi-utilisateurs. Sur un poste 42, des dizaines d'étudiants utilisent la même machine. Sans permissions, n'importe qui pourrait lire tes projets, modifier ton code, ou supprimer ton travail. Les permissions sont le mécanisme qui empêche ça.

Mais les permissions ne servent pas qu'à protéger des autres humains. Elles empêchent aussi les programmes de faire n'importe quoi. Un script buggé ne pourra pas écraser tes fichiers système si les permissions l'en empêchent. C'est une couche de sécurité fondamentale.

Lire les permissions

Quand tu fais ls -l, la première colonne affiche les permissions :

Terminal
ls -l
-rw-r--r-- 1 isoulima 42staff 61 Apr 5 10:30 main.c
-rwxr-xr-x 1 isoulima 42staff 8472 Apr 5 10:31 a.out
drwxr-xr-x 2 isoulima 42staff 4096 Apr 5 09:12 ex00
lrwxrwxrwx 1 isoulima 42staff 6 Apr 5 10:32 lien -> main.c

La chaîne de 10 caractères se décompose en 4 parties :

d   rwx   r-x   r-x
│   │     │     │
│   │     │     └── Others : les permissions pour tout le monde
│   │     └──────── Group  : les permissions pour le groupe
│   └────────────── User   : les permissions pour le propriétaire
└────────────────── Type   : le type de fichier
  • - = fichier normal
  • d = dossier (directory)
  • l = lien symbolique (un raccourci vers un autre fichier)
  • c, b = fichiers spéciaux (périphériques, tu n'y toucheras pas)

Les trois droits : r, w, x

Chaque droit a un sens différent selon qu'il s'applique à un fichier ou à un dossier :

Sur un fichierSur un dossier
Lire le contenu du fichier (cat, head, ouvrir dans un éditeur)Lister le contenu du dossier (ls). Sans r sur un dossier, ls affiche "Permission denied"
Sur un fichierSur un dossier
Modifier le contenu, écraser, ajouter du texteCréer, supprimer ou renommer des fichiers dans ce dossier. Attention : pour supprimer un fichier, c'est le w du dossier parent qui compte, pas celui du fichier

C'est un piège classique : tu peux supprimer un fichier en lecture seule si tu as le droit w sur le dossier qui le contient. La permission w d'un fichier ne protège que son contenu, pas son existence.

Sur un fichierSur un dossier
Exécuter le fichier comme un programme. Sans x, même si c'est un programme compilé, le système refuse de le lancerEntrer dans le dossier avec cd. Sans x, même avec r, tu ne peux pas traverser ce dossier ni accéder à ce qu'il contient

Exemple concret :

Terminal
gcc main.c -o mon_programme
./mon_programme
bash: ./mon_programme: Permission denied
ls -l mon_programme
-rw-r--r-- 1 isoulima 42staff 8472 Apr 5 10:31 mon_programme

Le programme est compilé mais x n'est pas activé. Le système refuse de l'exécuter. Il faut d'abord :

Terminal
chmod +x mon_programme
./mon_programme
Hello 42

Les trois groupes : user, group, others

Chaque fichier appartient à un propriétaire (user) et à un groupe. Les permissions sont définies séparément pour trois catégories de personnes :

Quand tu accèdes à un fichier, le système vérifie dans cet ordre :

  1. Tu es le propriétaire ? → applique les permissions User
  2. Tu es dans le groupe ? → applique les permissions Group
  3. Sinon → applique les permissions Others

Exemple :

-rw-r-----  1 isoulima 42staff  61 Apr  5 10:30 main.c
  • isoulima peut lire et écrire (rw-)
  • Les membres de 42staff peuvent lire (r--)
  • Les autres ne peuvent rien faire (---)

Le système octal

L'octal c'est un système de numération en base 8 (chiffres de 0 à 7). On l'utilise pour les permissions parce que 3 bits (r, w, x) = exactement un chiffre octal.

Chaque droit est un bit (activé ou pas) avec une valeur :

r = 4   (bit 2, binaire 100)
w = 2   (bit 1, binaire 010)
x = 1   (bit 0, binaire 001)

Tu additionnes les valeurs des droits que tu veux activer :

rwx = 4 + 2 + 1 = 7
rw- = 4 + 2 + 0 = 6
r-x = 4 + 0 + 1 = 5
r-- = 4 + 0 + 0 = 4
-wx = 0 + 2 + 1 = 3
-w- = 0 + 2 + 0 = 2
--x = 0 + 0 + 1 = 1
--- = 0 + 0 + 0 = 0

Trois chiffres = user, group, others :

chmod 754 fichier
        │││
        ││└── Others : r-- (4 = lire)
        │└─── Group  : r-x (5 = lire + exécuter)
        └──── User   : rwx (7 = tout)
rw-r--r--  → 644
rwxr-xr-x  → 755
rwx------  → 700
rw-------  → 600
rwxr-x---  → 750

Dans l'autre sens :

chmod 664 → rw-rw-r--
chmod 777 → rwxrwxrwx
chmod 000 → ---------
chmod 751 → rwxr-x--x

chmod — Modifier les permissions

Terminal
chmod 755 script.sh
ls -l script.sh
-rwxr-xr-x 1 isoulima 42staff 42 Apr 5 10:30 script.sh

Tu remplaces toutes les permissions d'un coup. C'est rapide et sans ambiguïté.

Terminal
chmod u+x script.sh # Ajouter x pour le user
chmod g-w main.c # Retirer w pour le group
chmod o= main.c # Mettre les droits others à rien
chmod a+r README # Ajouter r pour all (u + g + o)
chmod u=rwx,g=rx,o=rx script.sh # Équivalent de 755
  • + ajoute un droit
  • - retire un droit
  • = fixe les droits exactement (remplace tout)
  • u, g, o = user, group, others
  • a = all (les trois)
Terminal
chmod -R 755 mon_projet/

Change les permissions de tout le contenu du dossier (sous-dossiers inclus). Attention : donner x à tous les fichiers (pas juste les dossiers) est rarement ce que tu veux. Préfère :

Terminal
find mon_projet -type f -exec chmod 644 {} \; # Fichiers → 644
find mon_projet -type d -exec chmod 755 {} \; # Dossiers → 755

Permissions courantes à 42

OctalLettresUsage
755rwxr-xr-xScripts, programmes compilés, dossiers publics
644rw-r--r--Fichiers source (.c, .h, Makefile), fichiers texte
700rwx------Dossier privé (toi seul)
600rw-------Fichier privé (clé SSH, fichier de config sensible)
777rwxrwxrwxTout le monde peut tout faire — à éviter, c'est un trou de sécurité
000---------Personne ne peut rien faire — même toi (sauf si tu es root)

Cas concrets à 42

Terminal
gcc main.c -o mon_programme
./mon_programme
bash: ./mon_programme: Permission denied
chmod 755 mon_programme
./mon_programme
Hello 42
Terminal
chmod 700 ~/mon_projet

Les autres étudiants ne peuvent ni lire ni entrer dans le dossier.

Terminal
chmod 755 script.sh

Le script doit être exécutable. La Moulinette vérifie ça.

Terminal
ssh-keygen -t ed25519
ssh git@github.com
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: UNPROTECTED PRIVATE KEY FILE! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

La clé privée doit être en 600 (toi seul peut la lire) :

Terminal
chmod 600 ~/.ssh/id_ed25519

Propriétaire et groupe

Chaque fichier a un propriétaire et un groupe, affichés par ls -l :

-rw-r--r--  1 isoulima 42staff  61 main.c
                │        │
                │        └── Groupe : 42staff
                └─────────── Propriétaire : isoulima
Terminal
chown isoulima main.c
Terminal
chgrp 42staff main.c

Les deux en même temps :

Terminal
chown isoulima:42staff main.c

À 42, tu n'auras presque jamais besoin de chown/chgrp car tu travailles dans ton home et tu es déjà le propriétaire de tout. Mais comprendre le concept est essentiel.

umask — Les permissions par défaut

Quand tu crées un fichier, il n'a pas les permissions 777. Le système applique un masque qui retire certains droits. Ce masque s'appelle umask.

Terminal
umask
0022
  • Un fichier est créé en 644 (666 - 022)
  • Un dossier est créé en 755 (777 - 022)

Les fichiers partent de 666 (pas 777) parce que le système ne donne jamais x par défaut à un fichier — tu dois explicitement le rendre exécutable.

Tu n'as pas besoin de modifier le umask à 42. Mais si tu vois des permissions bizarres sur des fichiers nouvellement créés, c'est probablement le umask.

Chercher

find — Chercher des fichiers par nom

Terminal
find . -name "*.c"
./main.c
./ex00/ft_putchar.c
./ex01/ft_strlen.c
  • . = depuis le dossier courant
  • -name "*.c" = les fichiers dont le nom finit par .c
  • * = joker (n'importe quels caractères)
Terminal
find . -type f # Fichiers seulement
find . -type d # Dossiers seulement
Terminal
find . -size +1M # Plus de 1 Mo
find . -size -100c # Moins de 100 octets
Terminal
find . -mtime -1 # Modifié il y a moins de 24h
find . -newer main.c # Plus récent que main.c
Terminal
find . -name "*.o" -delete # Supprimer tous les .o
find . -name "*.c" -exec wc -l {} \; # Compter les lignes de chaque .c

grep — Chercher du texte dans les fichiers

Terminal
grep "write" main.c
write(1, &c, 1);
Terminal
grep "write" *.c
main.c: write(1, &c, 1);
ft_putstr.c: write(1, str++, 1);
Terminal
grep -r "include" .
./main.c:#include <unistd.h>
./ex00/ft_putchar.c:#include <unistd.h>
Terminal
grep -rn "write" .
./main.c:5: write(1, &c, 1);
Terminal
grep -i "makefile" .
Terminal
grep -v "^#" main.c # Lignes qui ne commencent pas par #
Terminal
grep -c "write" *.c
main.c:1
ft_putstr.c:1

Le manuel — man

Comment ça marche

Terminal
man ls

Ça ouvre une page interactive :

  • Flèches haut/bas pour naviguer
  • Space pour avancer d'une page
  • b pour reculer d'une page
  • /mot pour chercher "mot" dans la page
  • n pour aller à l'occurrence suivante
  • q pour quitter

Structure d'une page man

Chaque page man suit la même structure :

  • NAME — le nom et une description en une ligne
  • SYNOPSIS — la syntaxe de la commande (les options, les arguments)
  • DESCRIPTION — l'explication détaillée
  • OPTIONS — chaque option avec son explication
  • EXAMPLES — des exemples d'utilisation (pas toujours présent)
  • SEE ALSO — les commandes liées

Les sections du man

Le man est divisé en sections numérotées :

SectionContenu
1Commandes utilisateur (ls, cd, grep...)
2Appels système (write, read, open...)
3Fonctions de bibliothèque (printf, malloc...)
4Fichiers spéciaux
5Formats de fichiers
7Divers (conventions, protocoles)
8Commandes d'administration

À 42, tu utiliseras surtout les sections 1 (commandes), 2 (appels système) et 3 (fonctions C) :

Terminal
man 2 write # L'appel système write
man 3 printf # La fonction C printf
man ls # La commande ls (section 1 par défaut)

Si tu ne précises pas la section, man prend la première qu'il trouve. C'est pour ça que man printf montre la commande shell printf (section 1) et pas la fonction C printf (section 3). Pour la fonction C : man 3 printf.

Astuce

À 42, "lis le man" c'est la réponse à 90% des questions. Avant de demander à quelqu'un comment marche une commande ou une fonction, lis le man. C'est la compétence numéro un qu'on attend de toi.

Les variables d'environnement

Le shell a des variables qui stockent des informations sur ta session. On les reconnaît au $ devant leur nom.

VariableContenuExemple
$HOMETon dossier personnel/home/isoulima
$USERTon nom d'utilisateurisoulima
$PWDLe dossier courant/home/isoulima/ex00
$SHELLTon shell/bin/zsh
$PATHOù chercher les programmes/usr/bin:/bin:/usr/local/bin
Terminal
echo $USER
isoulima
echo $PATH
/usr/local/bin:/usr/bin:/bin

Le PATH

Quand tu tapes ls, comment le système sait-il quel programme exécuter ? Il cherche dans les dossiers listés dans $PATH, séparés par :.

Terminal
which ls
/usr/bin/ls
which gcc
/usr/bin/gcc
Terminal
which monprogramme
monprogramme not found

C'est pour ça que quand tu compiles un programme (gcc main.c -o a.out), tu dois l'exécuter avec ./a.out et pas juste a.out — le dossier courant (.) n'est pas dans le PATH par défaut (c'est une mesure de sécurité).

Créer et utiliser des variables

Terminal
PROJET="ft_printf"
echo $PROJET
ft_printf
echo "Je travaille sur $PROJET"
Je travaille sur ft_printf

Ces variables sont locales à la session. Pour les rendre disponibles aux programmes lancés depuis le terminal :

Terminal
export PROJET="ft_printf"

Pour des variables permanentes, tu les mets dans ~/.zshrc (ou ~/.bashrc). Ce fichier est lu à chaque ouverture de terminal.

Raccourcis clavier essentiels

Ces raccourcis fonctionnent dans tous les shells Unix :

RaccourciAction
TabAutocomplétion (noms de fichiers, commandes)
Tab TabLister toutes les possibilités
Ctrl+CInterrompre la commande en cours
Ctrl+DFermer le terminal (ou signaler fin de saisie)
Ctrl+LEffacer l'écran (comme clear)
Ctrl+AAller au début de la ligne
Ctrl+EAller à la fin de la ligne
Ctrl+UEffacer du curseur au début de la ligne
Ctrl+KEffacer du curseur à la fin de la ligne
Ctrl+WEffacer le mot précédent
Ctrl+RRechercher dans l'historique des commandes
/ Naviguer dans l'historique
!!Répéter la dernière commande
!$Dernier argument de la dernière commande

L'historique

Le shell garde un historique de toutes tes commandes. Tu peux :

  • Appuyer sur ↑ pour remonter dans l'historique
  • Taper history pour voir tout l'historique
  • Taper Ctrl+R puis un mot pour chercher une commande passée
  • Taper !42 pour réexécuter la commande numéro 42 de l'historique

Questionnaire

Questionnaire

Vérifie tes acquis — sélectionne la bonne réponse pour chaque question

1Tu es dans /home/isoulima/Documents. Quelle commande t'amène dans /home/isoulima/Downloads ?
2Que signifie le d dans drwxr-xr-x ?
3Un fichier a les permissions -rw-r-----. Qui peut le lire ?
4Tu fais chmod 750 mon_projet. Quels droits ont les "others" ?
5Tu veux supprimer tous les fichiers .o dans ton projet et ses sous-dossiers. Quelle commande ?
6Quelle est la différence entre > et >> ?
7Tu tapes ./mon_programme et tu obtiens Permission denied. Que fais-tu ?
8Tu veux chercher le mot "return" dans tous les fichiers .c de ton projet, récursivement, avec les numéros de ligne. Quelle commande ?
9Tu crées un fichier touch test.c puis tu fais ls -l test.c. La taille affichée est 0. Pourquoi ?
10Quelle commande affiche la documentation de l'appel système write (pas la commande shell) ?