🎯 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
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 ?
| Écriture | Résultat | Règle |
|---|---|---|
echo "Je suis $USER" | Je suis user | Les guillemets doubles remplacent les variables |
echo 'Je suis $USER' | Je suis $USER | Les apostrophes gardent le texte tel quel |
echo "Prix : \$5" | Prix : $5 | L'antislash annule le sens spécial d'un caractère |
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
| Variable | Contenu | Exemple |
|---|---|---|
HOME | Ton dossier personnel | /home/user |
USER | Ton identifiant | user |
SHELL | Ton shell de connexion | /bin/bash |
PWD | Le dossier courant | /home/user/labo |
LANG | Langue et encodage | fr_FR.UTF-8 |
EDITOR | L'éditeur préféré des commandes qui en ouvrent un | nano |
PATH | Où chercher les commandes | voir 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
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 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
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 :
| Fichier | Lu quand ? | On y met |
|---|---|---|
~/.bashrc | À l'ouverture de chaque terminal (shell interactif) | Alias, fonctions, invite, options de l'historique |
~/.profile | Une fois, à la connexion (session graphique, SSH, console) | Variables d'environnement : PATH, EDITOR… |
/etc/bash.bashrc, /etc/profile | Les mêmes moments, pour tous les utilisateurs | Ré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 :
| Code | Affiche | Code | Affiche |
|---|---|---|---|
\u | l'utilisateur | \w | le dossier courant (complet) |
\h | le nom de la machine | \W | le dossier courant (dernier élément) |
\t | l'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)
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 ?
nom = Alice provoque une erreur ?nom=Alice.echo 'Bonjour $USER' ?export ?~/bin au PATH sans rien casser ?$PATH) et on sépare par :../script.sh ?ls dans un dossier pourrait être lancé à ta place.~/.bashrc. Comment l'utiliser tout de suite ?source relit le fichier dans le shell courant. Ouvrir un nouveau terminal marche aussi.\w ?\u = utilisateur, \t = heure, \w = dossier courant.EDITOR pour qu'elle vaille pour toute la session ?.profile est lu à la connexion ; .bashrc conviendrait aussi pour les terminaux.🚀 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,
~/.profileajoutera~/binautomatiquement. - ✅ 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
~/.bashrcavec nano et de coller la lignePS1='\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.