$ carnet-linux
PHASE 2 · MODULE 09

Personnaliser son environnement

Variables, PATH, alias, invite de commande sur mesure : quelques lignes dans un fichier caché suffisent pour transformer le terminal en un outil taillé pour toi. C'est aussi la clé pour comprendre pourquoi une commande est « introuvable ».

⏱️ Lecture ~45 min 🧪 Pratique ~1 h 🎚️ Niveau intermédiaire
Tux

🎯 Ce que tu sauras à la fin

💲

Variables

Créer, lire, exporter, et comprendre l'environnement.

🧭

PATH

Savoir où le shell cherche les commandes, et l'étendre.

📝

.bashrc

Rendre ses réglages permanents : alias, fonctions, variables.

🎨

Invite

Une invite PS1 sur mesure, et un aperçu de Zsh.

Les variables du shell

▶ Vidéo · 1 min 30Variables et PATHun dollar pour lire, un égal pour écrire
Animation réalisée pour ce cours. Voix off et musique générées par IA (Google Gemini et Lyria).
user@ubuntu:~$ prenom=Alice                # créer : nom=valeur, SANS espaces
user@ubuntu:~$ echo "Bonjour $prenom"       # lire : $nom
Bonjour Alice
user@ubuntu:~$ echo "${prenom}_backup"      # accolades pour délimiter le nom
Alice_backup
user@ubuntu:~$ prenom = Bob
prenom : commande introuvable     # avec des espaces, le shell croit à une commande
user@ubuntu:~$ unset prenom                  # supprimer la variable

Guillemets doubles ou simples ?

ÉcritureRésultatRègle
echo "Je suis $USER"Je suis userLes guillemets doubles remplacent les variables
echo 'Je suis $USER'Je suis $USERLes apostrophes gardent le texte tel quel
echo "Prix : \$5"Prix : $5L'antislash annule le sens spécial d'un caractère
Toujours des guillemets autour d'une variable

Si une variable contient des espaces (un nom de fichier comme Mes Documents), ls $dossier la coupe en deux arguments. ls "$dossier" la garde entière. Prends l'habitude : "$variable", toujours.

Les variables d'environnement

Une variable ordinaire n'existe que dans le shell qui l'a créée. Avec export, elle devient une variable d'environnement : elle est transmise à tous les programmes que ce shell lance.

user@ubuntu:~$ couleur=bleu
user@ubuntu:~$ bash -c 'echo "enfant : $couleur"'    # un shell enfant ne la voit pas
enfant : 
user@ubuntu:~$ export couleur
user@ubuntu:~$ bash -c 'echo "enfant : $couleur"'
enfant : bleu
user@ubuntu:~$ LANG=C ls /nexistepas               # variable pour UNE seule commande
ls: cannot access '/nexistepas': No such file or directory
VariableContenuExemple
HOMETon dossier personnel/home/user
USERTon identifiantuser
SHELLTon shell de connexion/bin/bash
PWDLe dossier courant/home/user/labo
LANGLangue et encodagefr_FR.UTF-8
EDITORL'éditeur préféré des commandes qui en ouvrent unnano
PATHOù chercher les commandesvoir ci-dessous

env (ou printenv) affiche toutes les variables d'environnement ; printenv HOME en affiche une seule.

PATH : où le shell cherche les commandes

user@ubuntu:~$ echo $PATH
/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
user@ubuntu:~$ echo $PATH | tr ':' '\n'          # un dossier par ligne, plus lisible

Quand tu tapes ls, le shell parcourt ces dossiers dans l'ordre et lance le premier ls qu'il trouve. Si aucun dossier ne le contient : « commande introuvable ». C'est pour ça qu'un script dans ton dossier courant se lance avec ./script.sh : le dossier courant n'est pas dans le PATH, par sécurité.

Ajouter son propre dossier de commandes

user@ubuntu:~$ mkdir -p ~/bin
user@ubuntu:~$ printf '#!/bin/bash\necho "Bonjour depuis mon script"\n' > ~/bin/salut
user@ubuntu:~$ chmod +x ~/bin/salut
user@ubuntu:~$ export PATH="$HOME/bin:$PATH"       # on AJOUTE devant, sans écraser
user@ubuntu:~$ salut                                 # utilisable de partout
Bonjour depuis mon script
Ne jamais écraser le PATH

PATH=~/bin (sans :$PATH) remplace toute la liste : plus aucune commande ne fonctionne (ls, nano… deviennent « introuvables »). Pas de panique : ce n'est que dans ce terminal. Ferme-le et ouvre-en un autre, ou tape le chemin complet : /usr/bin/nano ~/.bashrc pour corriger le fichier fautif.

Le cadeau d'Ubuntu

Le fichier ~/.profile d'Ubuntu ajoute automatiquement ~/bin et ~/.local/bin au PATH, s'ils existent au moment de la connexion. Crée ~/bin, déconnecte-toi, reconnecte-toi : il est dans le PATH sans rien écrire.

Rendre ses réglages permanents : .bashrc

▶ Vidéo · 1 min 30Alias et .bashrcun terminal vraiment à toi
Animation réalisée pour ce cours. Voix off et musique générées par IA (Google Gemini et Lyria).

Tout ce que tu tapes dans un terminal disparaît à sa fermeture. Pour qu'un réglage soit permanent, on l'écrit dans un fichier de démarrage :

FichierLu quand ?On y met
~/.bashrcÀ l'ouverture de chaque terminal (shell interactif)Alias, fonctions, invite, options de l'historique
~/.profileUne fois, à la connexion (session graphique, SSH, console)Variables d'environnement : PATH, EDITOR…
/etc/bash.bashrc, /etc/profileLes mêmes moments, pour tous les utilisateursRéglages communs (administrateur)
user@ubuntu:~$ cp ~/.bashrc ~/.bashrc.bak                # toujours une copie avant de modifier
user@ubuntu:~$ nano ~/.bashrc                             # ajouter ses réglages À LA FIN du fichier
user@ubuntu:~$ source ~/.bashrc                           # appliquer sans rouvrir le terminal

Alias et fonctions

Ubuntu définit déjà quelques alias dans le .bashrc par défaut : ll (ls -alF), la (ls -A), l (ls -CF). La commande alias seule les liste tous.

# ---------- mes alias ----------
alias maj='sudo apt update && sudo apt upgrade -y'   # tout mettre à jour
alias rm='rm -i'                                    # confirmation avant suppression
alias ..='cd ..'
alias ports='sudo ss -tulpn'                          # qui écoute sur le réseau (module 12)
alias h='history | grep'                             # h apt : retrouver une commande

# ---------- mes fonctions ----------
mkcd() { mkdir -p "$1" && cd "$1"; }          # créer un dossier et y entrer

Un alias remplace un mot par un autre. Dès qu'il faut un argument au milieu ou plusieurs étapes, on écrit une fonction : $1 y désigne le premier argument (on approfondira au module 16). Pour ignorer un alias le temps d'une commande : \rm fichier.

Une invite sur mesure : PS1

La variable PS1 décrit l'invite, avec des codes spéciaux :

CodeAfficheCodeAffiche
\ul'utilisateur\wle dossier courant (complet)
\hle nom de la machine\Wle dossier courant (dernier élément)
\tl'heure (HH:MM:SS)\$$, ou # pour root
user@ubuntu:~$ PS1='\t \u@\h:\W\$ '
14:32:07 user@ubuntu:~$ 
user@ubuntu:~$ PS1='\[\e[1;33m\]\u\[\e[0m\] 📂 \[\e[1;36m\]\w\[\e[0m\] ❯ '   # en couleurs
user 📂 ~/labo ❯ 

Les codes \e[…m sont des couleurs ANSI (1;33 jaune gras, 1;36 cyan gras, 0 retour à la normale), et \[ \] les encadrent pour que Bash calcule correctement la longueur de la ligne. Teste dans le terminal ; quand le résultat te plaît, copie la ligne à la fin de ~/.bashrc.

Régler l'historique

Le .bashrc d'Ubuntu règle déjà l'historique. Quelques variables utiles à adapter :

HISTSIZE=10000                  # commandes gardées en mémoire (1000 par défaut)
HISTFILESIZE=20000              # commandes gardées dans ~/.bash_history
HISTCONTROL=ignoreboth          # ignore les doublons et les commandes commençant par un espace
HISTTIMEFORMAT='%F %T '         # date et heure de chaque commande dans « history »

Grâce à ignoreboth, une commande précédée d'un espace n'est pas enregistrée : pratique pour une commande contenant un mot de passe.

Aller plus loin : Zsh et Oh My Zsh

Zsh est un shell compatible avec Bash pour l'essentiel, avec une complétion plus riche, des corrections de fautes de frappe et des thèmes. Le framework Oh My Zsh ajoute des centaines d'extensions (git, docker…) et de thèmes.

user@ubuntu:~$ sudo apt install zsh
user@ubuntu:~$ zsh                                   # l'essayer sans rien changer (exit pour revenir)
user@ubuntu:~$ chsh -s $(which zsh)                  # en faire ton shell par défaut (à la prochaine connexion)
Lire avant d'exécuter

Oh My Zsh s'installe avec un script téléchargé (sh -c "$(curl -fsSL …)", voir le site officiel ohmyz.sh). Ce genre de commande exécute du code venu d'Internet : télécharge d'abord le script, lis-le, puis lance-le. Une habitude saine pour tous les scripts d'installation. Avec Zsh, la configuration se fait dans ~/.zshrc au lieu de ~/.bashrc. Ce cours continue en Bash, le shell présent partout.

Glossaire du module

Variable
Un nom associé à une valeur : nom=valeur, lue avec $nom.
Variable d'environnement
Variable exportée, transmise aux programmes lancés par le shell.
export
Transforme une variable en variable d'environnement.
PATH
Liste des dossiers où le shell cherche les commandes, séparés par :.
.bashrc
Fichier lu à l'ouverture de chaque terminal Bash.
.profile
Fichier lu une fois à la connexion.
source
Exécute un fichier dans le shell courant (pour appliquer des réglages).
Alias
Raccourci qui remplace un mot par une commande.
Fonction
Petit programme Bash nommé, qui accepte des arguments.
PS1
Variable qui définit l'invite de commande.
Zsh
Shell alternatif, très personnalisable (Oh My Zsh).

🧠 Quiz : as-tu tout retenu ?

1. Pourquoi nom = Alice provoque une erreur ?
L'affectation s'écrit sans espaces : nom=Alice.
2. Qu'affiche echo 'Bonjour $USER' ?
Les apostrophes empêchent le remplacement de la variable.
3. À quoi sert export ?
Pour la rendre permanente, il faut en plus l'écrire dans un fichier de démarrage.
4. Comment ajouter ~/bin au PATH sans rien casser ?
On garde l'ancien contenu ($PATH) et on sépare par :.
5. Pourquoi lance-t-on un script du dossier courant avec ./script.sh ?
C'est voulu : sinon un fichier piégé nommé ls dans un dossier pourrait être lancé à ta place.
6. Tu as ajouté un alias dans ~/.bashrc. Comment l'utiliser tout de suite ?
source relit le fichier dans le shell courant. Ouvrir un nouveau terminal marche aussi.
7. Dans PS1, que représente \w ?
\u = utilisateur, \t = heure, \w = dossier courant.
8. Où mettre une variable comme EDITOR pour qu'elle vaille pour toute la session ?
.profile est lu à la connexion ; .bashrc conviendrait aussi pour les terminaux.
Réponds aux questions pour voir ton score.

🚀 Mission pratique

À faire dans la machine virtuelle

Coche chaque étape une fois faite : sa correction s'affiche juste en dessous.

  • ✅ Correction
    $ echo "$HOME $USER $SHELL $LANG"
    /home/user user /bin/bash fr_FR.UTF-8
    $ env | wc -l
    56

    Le nombre exact dépend de ta session.

  • ✅ Correction
    $ fruit=mangue
    $ bash -c 'echo "[$fruit]"'
    []
    $ export fruit
    $ bash -c 'echo "[$fruit]"'
    [mangue]
  • ✅ Correction
    $ echo "$HOME"
    /home/user
    $ echo '$HOME'
    $HOME
  • ✅ Correction
    $ echo "$PATH" | tr ':' '\n'
    /home/user/.local/bin
    /usr/local/sbin
    /usr/local/bin
    /usr/sbin
    /usr/bin
    ...
    $ which python3
    /usr/bin/python3
  • ✅ Correction
    $ mkdir -p ~/bin
    $ printf '#!/bin/bash\necho "Bonjour $USER"\n' > ~/bin/salut
    $ chmod +x ~/bin/salut
    $ export PATH="$HOME/bin:$PATH"
    $ cd /tmp && salut
    Bonjour user

    Pour la rendre permanente sans rien écrire : déconnecte-toi et reconnecte-toi, ~/.profile ajoutera ~/bin automatiquement.

  • ✅ Correction
    $ PATH=/rien
    $ ls
    ls : commande introuvable
    # (Ubuntu indique parfois en plus où se trouve la commande, et que /usr/bin manque dans le PATH)
    $ /usr/bin/ls        # le chemin complet marche toujours
    $ exit               # fermer ce terminal suffit : rien n'a été écrit sur le disque
  • ✅ Correction
    $ cp ~/.bashrc ~/.bashrc.bak
    $ cat >> ~/.bashrc << 'FIN'
    
    # ---------- mes réglages ----------
    alias maj='sudo apt update && sudo apt upgrade -y'
    alias ..='cd ..'
    mkcd() { mkdir -p "$1" && cd "$1"; }
    FIN
    $ source ~/.bashrc
    $ mkcd ~/labo/essai && pwd
    /home/user/labo/essai
    $ ..  && pwd
    /home/user/labo

    Attention au double chevron >> : un seul > écraserait tout le fichier (d'où la sauvegarde).

  • ✅ Correction
    $ alias
    alias ..='cd ..'
    alias l='ls -CF'
    alias la='ls -A'
    alias ll='ls -alF'
    alias ls='ls --color=auto'
    alias maj='sudo apt update && sudo apt upgrade -y'
    ...
    $ \ls          # sans couleurs : l'alias est ignoré
  • ✅ Correction
    $ PS1='\t \u@\h:\W\$ '
    14:32:07 user@ubuntu:~$
    $ echo "PS1='\t \u@\h:\W\\$ '" >> ~/.bashrc

    Le plus sûr reste d'ouvrir ~/.bashrc avec nano et de coller la ligne PS1='\t \u@\h:\W\$ ' à la fin. Pour revenir en arrière : cp ~/.bashrc.bak ~/.bashrc.

  • ✅ Correction
    $ sudo apt install zsh
    $ zsh
    # au premier lancement, un menu propose de créer ~/.zshrc : choisir (2) pour la configuration recommandée
    % exit

    Tant que tu n'as pas utilisé chsh, Bash reste ton shell par défaut.

💬 Questions fréquentes

Les questions qui reviennent le plus souvent sur ce module, avec leurs réponses.

J'ai cassé mon .bashrc : le terminal se ferme ou affiche des erreurs

Restaure la sauvegarde : cp ~/.bashrc.bak ~/.bashrc. Si aucun terminal ne s'ouvre, lance bash --norc (Bash sans lire le fichier), ou passe en console avec Ctrl + Alt + F3. Sans sauvegarde, la version d'origine d'Ubuntu est dans /etc/skel/.bashrc.

Mon alias fonctionne dans le terminal mais pas dans mes scripts

C'est normal : les scripts ne lisent pas .bashrc et n'utilisent pas les alias. Dans un script, écris la commande complète, ou définis une fonction dans le script lui-même.

J'ai modifié ~/.profile mais rien ne change

.profile n'est lu qu'à la connexion : déconnecte-toi de la session graphique et reconnecte-toi (fermer le terminal ne suffit pas). Pour tester immédiatement dans un terminal : source ~/.profile.