_quoteSimulator = {
quote_scenario;
const term = aptitek.createTerminal("#quote-sim-terminal", { defaultPrompt: false, showCursor: false });
if (quote_scenario.startsWith("mkdir mon super")) {
term.writeLine("$ mkdir mon super projet", { type: "info" });
term.writeLine("Découpage argv par Bash : Programme='mkdir' | Arg1='mon' | Arg2='super' | Arg3='projet'", { type: "warning" });
term.writeLine("❌ Résultat : 3 dossiers distincts ('mon', 'super', 'projet') ont été créés par erreur !", { type: "danger" });
} else if (quote_scenario.startsWith("mkdir 'mon super")) {
term.writeLine("$ mkdir 'mon super projet' (ou mkdir mon\\ super\\ projet)", { type: "info" });
term.writeLine("Découpage argv par Bash : Programme='mkdir' | Arg1='mon super projet' (1 seul bloc !)", { type: "success" });
term.writeLine("✅ Résultat : Un unique dossier nommé 'mon super projet' est créé proprement.", { type: "success" });
} else if (quote_scenario.includes("Guillemets doubles")) {
term.writeLine("$ echo \"Trésor de $USER dans $PWD\"", { type: "info" });
term.writeLine("Expansion des variables : $USER -> 'student' | $PWD -> '/home/student/workspace'", { type: "info" });
term.writeLine("Sortie écran : Trésor de student dans /home/student/workspace", { type: "success" });
} else if (quote_scenario.includes("Apostrophes")) {
term.writeLine("$ echo 'Trésor de $USER dans $PWD'", { type: "info" });
term.writeLine("Expansion des variables : DÉSACTIVÉE (Strong quoting '...')", { type: "warning" });
term.writeLine("Sortie écran : Trésor de $USER dans $PWD", { type: "success" });
} else if (quote_scenario.startsWith("cat -piege.txt")) {
term.writeLine("$ cat -piege.txt", { type: "info" });
term.writeLine("cat: invalid option -- 'p'\nTry 'cat --help' for more information.", { type: "danger" });
term.writeLine("❌ Le tiret initial fait croire à 'cat' que vous lui passez les options -p -i -e -g -e !", { type: "danger" });
} else {
term.writeLine("$ cat -- -piege.txt (ou : cat ./-piege.txt)", { type: "info" });
term.writeLine("Bravo, tu m'as lu !", { type: "success" });
term.writeLine("✅ '--' signale la fin des options : tout ce qui suit est traité comme un nom de fichier.", { type: "success" });
}
invalidation.then(() => term.destroy());
}Navigation, Échappement & Manipulation
Linux
Système & Réseau
Naviguer avec les chemins absolus/relatifs, déjouer les pièges d’espaces et d’échappement, éditer avec bat/micro et rechercher avec grep/find/cut.
Se déplacer avec fluidité dans l’arborescence Linux sans jamais toucher la souris repose sur la maîtrise des chemins, des symboles spéciaux du Shell et des règles d’interprétation des caractères par bash.
🗺️ Chemin Absolu vs Chemin Relatif : Le GPS contre le Piéton
Pour désigner l’emplacement d’un fichier ou d’un dossier avec cd (Change Directory), deux approches coexistent :
Le Chemin Absolu (Le GPS)
C’est une coordonnée postale complète : France / Rhône / Villeurbanne. Peu importe où vous vous trouvez actuellement, cette adresse mène toujours exactement au même endroit.
- Règle absolue : Un chemin absolu commence toujours par le slash de la racine
/.
# Mène aux journaux système depuis n'importe où
cd /var/log
Le Chemin Relatif (Le Piéton)
C’est l’indication donnée à un passant : « Prenez la porte en face, puis montez d’un étage ». Le point d’arrivée dépend entièrement de l’endroit où vous êtes au moment où vous parlez.
- Règle absolue : Un chemin relatif ne commence jamais par
/.
# Entre dans le sous-dossier "apt" situé devant nous
cd apt🕵️ Fichiers Cachés, Casse et Magic Bytes
Le Mythe des Fichiers Cachés (
.fichier)
Sous Windows, on cache un fichier en cochant une case « Caché » dans ses propriétés. Sous Linux, il n’existe aucune case « caché » dans l’inode !
C’est une simple convention héritée d’une paresse des créateurs d’Unix dans les années 1970 : pour éviter que ls n’affiche . et .. en permanence, ils ont codé une règle disant « Si le nom commence par un point ., ne l’affiche pas ».
# Cacher un fichier consiste simplement à le renommer avec mv !
touch secret.txt
mv secret.txt .secret.txt
ls # Disparu !
ls -a # Toujours là, avec le même inode !
Casse Stricte & Magic Bytes (
file)
Deux règles d’or différencient radicalement Linux de Windows :
- Sensibilité stricte à la casse :
Rapport.txt,rapport.txtetRAPPORT.TXTsont trois fichiers différents pouvant cohabiter dans le même dossier. - Les extensions n’ont aucun pouvoir magique : Renommer
image.pngenimage.txtne trompe pas Linux. Le système inspecte les premiers octets à l’intérieur du fichier (Magic Bytes) grâce à la commandefile:
file /bin/ls
# -> ELF 64-bit LSB pie executable (sans extension .exe !)🛡️ Espaces, Pièges Mortels et les 3 Armes d’Échappement
Que se passe-t-il si un débutant tente de créer un dossier nommé mon super projet en tapant naïvement la commande suivante ?
mkdir mon super projetAu lieu d’un seul dossier, Linux crée trois dossiers séparés (mon, super et projet) ! Pourquoi ? Parce que pour le Shell, l’espace est le séparateur d’arguments. Si un malheureux tape rm -rf mon super / avec un espace malheureux avant le slash, il ordonne la suppression de la racine / !
⚔️ Les 3 Armes d’Échappement (Escaping) et le Boss Final (--)
Pour ordonner au Shell de traiter un espace ou un caractère spécial ($, *, ?) comme du simple texte :
| Méthode | Syntaxe | Comportement exact dans le Shell | Exemple concret |
|---|---|---|---|
1. L’Anti-slash (\)Caractère par caractère |
\ devant |
Annule le pouvoir spécial du seul caractère situé juste après lui (la touche Tab les ajoute toute seule !). |
mkdir mon\ super\ projet |
2. Guillemets doubles ("...")Souple (Weak) |
"texte ici" |
Protège les espaces, mais laisse le Shell évaluer les variables ($USER) et substitutions $(...). |
echo "Je suis $USER" \(\rightarrow\) Affiche : Je suis student |
3. Apostrophes ('...')Strict (Strong) |
'texte ici' |
Fige absolument tout. Aucun caractère ($, \, *) n’est interprété : 100 % texte brut. |
echo 'Je suis $USER' \(\rightarrow\) Affiche : Je suis $USER |
4. Le Boss Final (./ ou --)Fichier -nom |
cmd -- -fichier |
Si un fichier commence par un tiret (-piège.txt), cat croit voir une option. Utilisez ./-piège.txt ou --. |
cat -- -piège.txt ou rm ./-piège.txt |
🧪 Laboratoire Interactif : Comment bash Découpe et Évalue vos Commandes
Testez les différents modes de protection ci-dessous pour visualiser comment le Shell analyse la ligne avant de l’exécuter :
Simulateur d’Échappement & Quoting Bash
Choisissez une commande à analyser par l’interpréteur bash :
Analyseur Syntaxique Bash
🛠️ Manipuler, Lire, Éditer et Rechercher
Une fois les chemins maîtrisés, voici la boîte à outils complète pour créer des arborescences, lire, éditer et fouiller dans vos fichiers :
Créer, Déplacer & Supprimer
mkdir [-p] dossier: Crée un dossier. L’option-p(parents) crée toute la hiérarchie intermédiaire si nécessaire. Combinée avec l’expansion d’accolades (Brace expansion), elle bâtit tout un projet en une ligne :mkdir -p projet/{config,logs,scripts}rmdir dossier: Supprime uniquement un dossier vide.touch fichier: Crée un fichier vide s’il n’existe pas (ou met à jour sa datemtime).cp source cible: Copie un fichier (cp -Rpour un dossier entier).mv source cible: Déplace ou renomme un fichier ou dossier.rm [-R] fichier: Supprime définitivement un fichier (-Rou-rfpour supprimer récursivement un dossier et tout son contenu).
Lire & Éditer (
cat, bat, micro)
cat fichier: Affiche d’un bloc tout le contenu brut d’un ou plusieurs fichiers.bat fichier: Le remplaçant moderne decat(binairebatcatsur Ubuntu) avec coloration syntaxique, numéros de lignes et pagination automatique !more/less fichier: Affiche un long fichier page par page en mode interactif.head -n 5/tail -n 5 fichier: Affiche uniquement les 5 premières (head) ou 5 dernières (tail) lignes d’un fichier.micro fichier: Éditeur de texte moderne dans le terminal utilisant les raccourcis universels :Ctrl + S: SauvegarderCtrl + Q: QuitterCtrl + F: Rechercher (Ctrl + C/Ctrl + Vpour copier/coller)
🔎 Sélecteurs (Globbing), Analyse et Recherche
Dans toutes ces commandes, on peut remplacer un nom de fichier par un sélecteur (wildcard) : par exemple, ls *.txt cible tous les fichiers finissant par .txt.
| Commande | Rôle et exemple d’utilisation |
|---|---|
echo [-e] texte |
Affiche le texte passé en paramètre (-e active les retours à la ligne \n et tabulations \t). |
wc fichier |
Word Count — Compte le nombre de lignes (-l), de mots (-w) et de caractères/octets (-c) d’un fichier. |
diff fichier1 fichier2 |
Compare deux fichiers ligne par ligne et affiche leurs différences exactes. |
cut fichier -d ':' -f 1,3 |
Découpe chaque ligne selon le délimiteur -d (ici :) et n’extrait que les colonnes -f demandées (ex: 1 et 3). |
grep regexp fichier |
Filtre et affiche uniquement les lignes qui valident l’expression régulière (ex: grep "ERROR" app.log). |
find dossier [critères] |
Recherche récursive de fichiers par nom (-name "*.conf"), par propriétaire (-user student) ou par taille (-size). |
🏆 Défis Pratiques & Mini-TP Fil Rouge
Testez vos réflexes sur ces deux missions pratiques avant de regarder les solutions :
Défi Express : « Le Parcours d’Obstacles »
Réalisez cet enchaînement en 3 étapes au clavier :
- Créez en une seule commande un dossier caché nommé
.coffre fort(avec un espace !) dans~/workspace. - Entrez dans ce dossier, puis créez un fichier nommé
-tresor.txtcontenant le texte1000 pieces d'or $USERoù$USERdoit rester écrit littéralement$USERsans être remplacé parstudent. - Depuis ce dossier, affichez le contenu de
/etc/hostnameen utilisant uniquement un chemin relatif (avec des..).
Mini-TP : « L’Archiviste du Serveur »
Vous prenez la main sur un nouveau conteneur :
- Exploration : Via
man uname, trouvez l’option affichant toutes les infos du noyau et exécutez-la. - Architecture : Dans
~/workspace, créez en une seule commande :webapp/releases/v1.0,webapp/releases/v2.0,webapp/shared/configetwebapp/logs. - Édition : Avec
micro, créezwebapp/shared/config/settings.ini(port = 8080), vérifiez avecbat, et inspectez son inode/datemtimeavecstat. - Déploiement : Créez
index.htmldansv1.0etv2.0, liezwebapp/currentversreleases/v1.0(ln -s), puis basculez-le versreleases/v2.0sans temps d’arrêt !
✅ Corrigé Complet des 2 Défis (Cliquez pour révéler)
1. Corrigé du « Parcours d’Obstacles » :
# 1. Dossier caché avec espace
mkdir ~/workspace/".coffre fort"
# 2. Entrer dedans et créer un fichier commençant par "-" avec texte figé
cd ~/workspace/.coffre\ fort
echo "1000 pieces d'or \$USER" > ./-tresor.txt
# 3. Remonter de .coffre fort -> workspace -> student -> home -> /
cat ../../../../etc/hostname2. Corrigé du Mini-TP « L’Archiviste du Serveur » :
# 1. Manuel et infos système complètes
uname -a
# 2. Arborescence complète en une seule ligne (Brace expansion + mkdir -p)
mkdir -p ~/workspace/webapp/{releases/{v1.0,v2.0},shared/config,logs}
# 3. Édition, lecture colorée et enquête d'Inode
micro ~/workspace/webapp/shared/config/settings.ini
bat ~/workspace/webapp/shared/config/settings.ini
stat ~/workspace/webapp/shared/config/settings.ini
# 4. Déploiement par lien symbolique et bascule v1.0 -> v2.0
cd ~/workspace/webapp
echo "<h1>Version 1</h1>" > releases/v1.0/index.html
echo "<h1>Version 2</h1>" > releases/v2.0/index.html
ln -s releases/v1.0 current
bat current/index.html
# Bascule atomique vers la v2.0 (-s : symbolique, -f : force, -n : ne suit pas le dossier cible)
ln -sfn releases/v2.0 current
bat current/index.html