34 - Systèmes (Shell)

QCM – vérification des prérequis

Pour chaque question, une seule réponse est correcte.

1. Quelle commande affiche le contenu du répertoire courant ?

  • A. cd
  • B. ls
  • C. pwd
  • D. cat
Correction

Réponse : B. ls (list) liste les fichiers et dossiers du répertoire courant.

  • A est faux : cd (change directory) change de répertoire.
  • C est faux : pwd (print working directory) affiche le chemin du répertoire courant.
  • D est faux : cat affiche le contenu d’un fichier.

2. Que fait la commande cd .. ?

  • A. Elle crée un nouveau dossier
  • B. Elle remonte au répertoire parent
  • C. Elle supprime le répertoire courant
  • D. Elle affiche le chemin absolu du répertoire courant
Correction

Réponse : B. .. désigne le répertoire parent. cd .. remonte donc d’un niveau dans l’arborescence.

  • A est faux : créer un dossier se fait avec mkdir.
  • C est faux : supprimer un répertoire se fait avec rmdir ou rm -r.
  • D est faux : c’est le rôle de pwd.

3. Quelle est la différence entre un chemin absolu et un chemin relatif ?

  • A. Un chemin absolu commence par le nom d’un fichier, un chemin relatif par /
  • B. Un chemin absolu commence par / (la racine), un chemin relatif part du répertoire courant
  • C. Il n’y a aucune différence
  • D. Un chemin relatif ne peut désigner que des fichiers, pas des dossiers
Correction

Réponse : B. Un chemin absolu part de la racine du système de fichiers (/ sous Linux/Mac). Un chemin relatif est interprété à partir du répertoire dans lequel on se trouve.

  • A est faux : c’est exactement l’inverse.
  • C est faux : les deux notions sont fondamentalement différentes.
  • D est faux : un chemin relatif peut désigner aussi bien un fichier qu’un dossier.

4. Que fait la commande cp fichier.txt copie.txt ?

  • A. Elle déplace fichier.txt vers copie.txt
  • B. Elle renomme fichier.txt en copie.txt
  • C. Elle crée une copie de fichier.txt nommée copie.txt
  • D. Elle compare les deux fichiers
Correction

Réponse : C. cp (copy) crée une copie du fichier. Après l’exécution, les deux fichiers existent.

  • A est faux : déplacer un fichier se fait avec mv.
  • B est faux : renommer se fait aussi avec mv ; cp conserve l’original.
  • D est faux : comparer des fichiers se fait avec diff.

TP : commandes système sous Linux

Ce TP guide la découverte des commandes fondamentales d’un système Linux. Vous utiliserez le simulateur de terminal pour tester chaque commande (le simulateur Terminus présenté dans le cours sur les systèmes d’exploitation convient aussi). N’hésitez pas à expérimenter au-delà des exemples proposés.

Définition. Sous Linux, les fichiers et dossiers sont organisés en une structure hiérarchique appelée arborescence. La racine de cette arborescence est notée /. Chaque utilisateur dispose d’un répertoire personnel situé dans /home/.

Chemins absolus et relatifs. Un chemin absolu commence par / et décrit le trajet depuis la racine. Un chemin relatif décrit le trajet depuis le répertoire courant. Le symbole ~ désigne le répertoire personnel de l’utilisateur.

Exercice 1 : découvrir l’arborescence.

  1. Afficher le répertoire courant avec la commande pwd.
  2. Lister le contenu du répertoire courant avec ls.
  3. Se déplacer dans le répertoire /home avec cd /home, puis vérifier avec pwd.
  4. Revenir dans son répertoire personnel avec cd ~.
  5. Utiliser ls -la pour afficher les fichiers cachés. Que remarque-t-on ?
Correction
  1. pwd affiche le chemin absolu du répertoire courant, par exemple /home/user.
  2. ls liste les fichiers et dossiers visibles du répertoire courant.
  3. Après cd /home puis pwd, on obtient /home.
  4. cd ~ ramène dans le répertoire personnel de l’utilisateur.
  5. ls -la affiche tous les fichiers, y compris ceux commençant par un point (fichiers cachés), ainsi que les permissions, le propriétaire et la taille.

Exercice 2 : manipuler les chemins.

  1. Depuis son répertoire personnel, afficher le contenu de /etc sans s’y déplacer avec ls /etc.
  2. Créer un dossier projets avec mkdir projets.
  3. Se déplacer dans projets, puis créer un sous-dossier tp1 avec mkdir tp1.
  4. Revenir au répertoire parent avec cd .. et vérifier avec pwd.
  5. Afficher l’arborescence complète de projets avec tree projets.
Correction
  1. ls /etc affiche le contenu du dossier /etc sans changer de répertoire courant.
  2. mkdir projets crée le dossier projets dans le répertoire courant.
  3. cd projets puis mkdir tp1 crée le sous-dossier tp1 dans projets.
  4. cd .. remonte d’un niveau. pwd confirme le retour au répertoire personnel.
  5. tree projets affiche la structure arborescente du dossier projets et de ses sous-dossiers.

Manipulation de fichiers et dossiers

Rappel. Les commandes de manipulation de fichiers sont destructives : une suppression avec rm est définitive (il n’y a pas de corbeille sous Linux). Soyez toujours prudent avant de supprimer un fichier ou un dossier.

Exercice 3 : créer et supprimer.

  1. Créer un fichier vide notes.txt avec touch notes.txt.
  2. Écrire du texte dedans avec echo "Ceci est un test" > notes.txt.
  3. Vérifier le contenu avec cat notes.txt.
  4. Ajouter une deuxième ligne avec echo "Deuxième ligne" >> notes.txt. Quelle est la différence entre > et >> ?
  5. Copier le fichier avec cp notes.txt copie.txt, puis vérifier avec ls.
  6. Renommer copie.txt en sauvegarde.txt avec mv copie.txt sauvegarde.txt.
  7. Supprimer sauvegarde.txt avec rm sauvegarde.txt.
Correction
  1. touch notes.txt crée un fichier vide ou met à jour la date de modification s’il existe déjà.
  2. echo "Ceci est un test" > notes.txt écrit le texte dans le fichier en écrasant le contenu précédent.
  3. cat notes.txt affiche le contenu du fichier dans le terminal.
  4. >> ajoute à la fin du fichier (concaténation) tandis que > écrase le contenu existant (redirection).
  5. cp notes.txt copie.txt crée une copie identique du fichier. ls confirme la présence des deux fichiers.
  6. mv copie.txt sauvegarde.txt renomme le fichier (ou le déplace si un chemin est spécifié).
  7. rm sauvegarde.txt supprime définitivement le fichier.

Exercice 4 : opérations sur les dossiers.

  1. Créer une arborescence en une seule commande avec mkdir -p cours/nsi/chapitre1.
  2. Vérifier le résultat avec tree cours.
  3. Créer un fichier cours/nsi/chapitre1/resume.txt avec un contenu de votre choix.
  4. Essayer de supprimer le dossier cours avec rm cours. Que se passe-t-il ?
  5. Utiliser rm -r cours pour supprimer le dossier et tout son contenu.
  6. Expliquer pourquoi l’option -r est nécessaire.
Correction
  1. mkdir -p crée le dossier et tous les dossiers parents manquants en une seule commande.
  2. tree cours affiche cours/nsi/chapitre1 sous forme arborescente.
  3. Par exemple, echo "Résumé du chapitre 1" > cours/nsi/chapitre1/resume.txt.
  4. rm cours échoue car rm ne peut pas supprimer un dossier sans l’option -r.
  5. rm -r cours supprime récursivement le dossier et tout son contenu.
  6. L’option -r (récursif) est nécessaire pour parcourir et supprimer chaque sous-dossier et fichier contenu dans le dossier.

Traitement de texte

La philosophie Unix repose sur des outils simples qui font une seule chose bien, et que l’on combine avec le pipe (|) pour réaliser des traitements complexes. Le pipe transmet la sortie d’une commande comme entrée de la suivante.

Exercice 5 : filtrage et recherche.

Commencer par créer un fichier de données :

echo "Alice 15\nBob 12\nCharlie 18\nDiana 15\nEve 12\nFrank 20" > eleves.txt
  1. Afficher les 3 premières lignes avec head -n 3 eleves.txt.
  2. Afficher les 2 dernières lignes avec tail -n 2 eleves.txt.
  3. Compter le nombre de lignes avec wc -l eleves.txt.
  4. Rechercher les élèves ayant 15 avec grep 15 eleves.txt.
  5. Trier le fichier par ordre alphabétique avec sort eleves.txt.
  6. Combiner les commandes : cat eleves.txt | sort | uniq. Expliquer le résultat.
  7. Rechercher les lignes ne contenant pas « 15 » avec grep -v 15 eleves.txt.
Correction
  1. head -n 3 affiche les lignes : Alice 15, Bob 12, Charlie 18.
  2. tail -n 2 affiche les lignes : Eve 12, Frank 20.
  3. wc -l renvoie 6, le nombre total de lignes du fichier.
  4. grep 15 affiche les lignes contenant « 15 » : Alice 15 et Diana 15.
  5. sort trie les lignes par ordre alphabétique (Alice, Bob, Charlie, Diana, Eve, Frank).
  6. Le pipe enchaîne trois commandes : cat lit le fichier, sort trie les lignes, uniq supprime les doublons consécutifs. Ici, comme toutes les lignes sont différentes, le résultat est identique au tri.
  7. grep -v 15 affiche toutes les lignes sauf celles contenant « 15 » : Bob 12, Charlie 18, Eve 12, Frank 20.

Exercice 6 : pipes et enchaînements.

  1. Créer un fichier fruits.txt contenant : pomme, banane, cerise, pomme, banane, datte, pomme (une par ligne).
  2. Compter le nombre d’occurrences de chaque fruit avec sort fruits.txt | uniq -c.
  3. Afficher uniquement les lignes contenant « an » avec grep an fruits.txt.
  4. Compter le nombre de lignes contenant « pomme » avec grep -c pomme fruits.txt.
  5. Rechercher récursivement le mot « test » dans tous les fichiers du répertoire courant avec grep -r test .
  6. Enchaîner deux commandes avec && : créer un dossier et s’y déplacer en une seule ligne.
Correction
  1. Par exemple : echo "pomme\nbanane\ncerise\npomme\nbanane\ndatte\npomme" > fruits.txt.
  2. sort | uniq -c trie d’abord les lignes, puis compte les occurrences consécutives : 2 banane, 1 cerise, 1 datte, 3 pomme.
  3. grep an fruits.txt affiche « banane » (deux fois) car ces lignes contiennent « an ».
  4. grep -c pomme fruits.txt renvoie 3.
  5. grep -r test . recherche récursivement dans tous les fichiers et affiche les correspondances avec le nom de fichier.
  6. Par exemple : mkdir travail && cd travail. L’opérateur && exécute la seconde commande uniquement si la première réussit.

Permissions et utilisateurs

Définition. Chaque fichier possède trois catégories de permissions : lecture (r), écriture (w) et exécution (x), définies pour trois entités : le propriétaire (u), le groupe (g) et les autres (o). Ces permissions sont affichées sous la forme rwxrwxrwx ou en notation octale (par exemple 755).

Notation octale. Chaque chiffre représente les permissions d’une entité : r = 4, w = 2, x = 1. Par exemple, 755 signifie : propriétaire = 7 (rwx), groupe = 5 (r-x), autres = 5 (r-x).

Exercice 7 : gérer les permissions.

  1. Créer un fichier script.sh avec echo "#!/bin/bash" > script.sh.
  2. Afficher ses permissions avec ls -l script.sh. Les décrire.
  3. Rendre le fichier exécutable pour le propriétaire avec chmod u+x script.sh.
  4. Vérifier le changement avec ls -l script.sh.
  5. Utiliser la notation octale pour donner les permissions rwxr-xr-- avec chmod 754 script.sh.
  6. Vérifier avec stat script.sh les informations détaillées du fichier.
Correction
  1. echo "#!/bin/bash" > script.sh crée un fichier contenant la ligne shebang.
  2. ls -l affiche par exemple -rw-r--r-- : lecture et écriture pour le propriétaire, lecture seule pour le groupe et les autres, pas d’exécution.
  3. chmod u+x ajoute le droit d’exécution au propriétaire. Le résultat est -rwxr--r--.
  4. On vérifie que le x est apparu dans les permissions du propriétaire.
  5. chmod 754 donne : propriétaire = rwx (4+2+1=7), groupe = r-x (4+0+1=5), autres = r– (4+0+0=4).
  6. stat affiche des informations détaillées : taille, permissions, dates de modification, etc.

Exercice 8 : utilisateurs et droits.

  1. Afficher son nom d’utilisateur avec whoami.
  2. Afficher ses identifiants avec id. Que représentent l’UID et le GID ?
  3. Essayer de passer en superutilisateur avec su root. Que se passe-t-il ?
  4. Utiliser sudo ls /root. Quelle est la différence entre su et sudo ?
Correction
  1. whoami affiche le nom de l’utilisateur courant, par exemple user.
  2. id affiche l’UID (identifiant numérique de l’utilisateur) et le GID (identifiant du groupe principal). Ce sont les identifiants internes utilisés par le système.
  3. su root demande le mot de passe de root pour basculer sur le compte superutilisateur. En situation réelle, il faut connaître ce mot de passe.
  4. sudo exécute une seule commande avec les droits superutilisateur, tandis que su change complètement de session utilisateur. sudo est préférable car il limite les privilèges à une commande.

Informations système

Exercice 9 : explorer le système.

  1. Afficher le nom de la machine avec hostname.
  2. Afficher les informations du système avec uname -a. Identifier le noyau et l’architecture.
  3. Afficher la date et l’heure avec date.
  4. Afficher l’utilisation du disque avec df -h. Que signifie l’option -h ?
  5. Afficher l’utilisation de la mémoire avec free -h.
Correction
  1. hostname affiche le nom de la machine sur le réseau, par exemple linux-nsi.
  2. uname -a affiche le nom du noyau (Linux), sa version, l’architecture (x86_64), etc.
  3. date affiche la date et l’heure actuelles du système.
  4. df -h affiche l’espace disque utilisé et disponible. L’option -h signifie human-readable : les tailles sont affichées en Ko, Mo, Go.
  5. free -h affiche l’utilisation de la mémoire RAM et du swap en format lisible.

Exercice 10 : historique et variables.

  1. Taper plusieurs commandes, puis afficher l’historique avec history.
  2. Afficher les variables d’environnement avec env. Identifier la variable HOME.
  3. Afficher la valeur de HOME avec echo $HOME.
  4. Créer une variable avec export MA_VAR=bonjour, puis l’afficher avec echo $MA_VAR.
  5. Créer un alias avec alias ll="ls -la", puis le tester.
Correction
  1. history affiche la liste numérotée de toutes les commandes saisies dans la session.
  2. env affiche toutes les variables d’environnement. HOME contient le chemin du répertoire personnel, par exemple /home/user.
  3. echo $HOME affiche la valeur de la variable, ici /home/user.
  4. export MA_VAR=bonjour crée une variable d’environnement. echo $MA_VAR affiche bonjour.
  5. alias ll="ls -la" crée un raccourci. Taper ll exécute ls -la.

Recherche de fichiers

Exercice 11 : trouver et identifier.

  1. Créer l’arborescence suivante :

    mkdir -p projet/src projet/docs projet/tests
    touch projet/src/main.py projet/src/utils.py
    touch projet/docs/readme.txt projet/tests/test_main.py
    
  2. Rechercher tous les fichiers Python avec find projet -name "*.py".

  3. Rechercher uniquement les dossiers avec find projet -type d.

  4. Identifier le type du fichier projet/src/main.py avec file projet/src/main.py.

  5. Vérifier l’emplacement de la commande ls avec which ls.

  6. Consulter le manuel de la commande grep avec man grep.

Correction
  1. Les commandes mkdir -p et touch créent l’arborescence demandée.
  2. find projet -name "*.py" trouve tous les fichiers dont le nom se termine par .py : main.py, utils.py, test_main.py.
  3. find projet -type d liste tous les répertoires : projet, projet/src, projet/docs, projet/tests.
  4. file identifie le type du fichier : ici un fichier texte (ASCII text).
  5. which ls affiche le chemin de l’exécutable ls, par exemple /usr/bin/ls.
  6. man grep affiche le manuel détaillé de la commande grep avec ses options et exemples.

Commandes essentielles à retenir

  • Navigation : pwd, cd, ls, tree ;
  • Fichiers : touch, cp, mv, rm, mkdir, cat, echo ;
  • Texte : head, tail, wc, grep, sort, uniq ;
  • Permissions : chmod, ls -l, whoami, id, sudo ;
  • Système : uname, hostname, date, df, free, history ;
  • Recherche : find, file, which, man ;
  • Opérateurs : > (redirection), >> (ajout), | (pipe), && (enchaînement).