Zsh
Zsh est le shell par défaut sur macOS. Il est hautement personnalisable et compatible avec Bash.
Quand l'utiliser
- Shell interactif à haute productivité : Autocomplétion interactive, navigation floue, recherche dans l'historique et indicateurs de branche.
- Écosystème moderne de plugins CLI : Accélération des workflows shell avec
zsh-autosuggestions,zsh-syntax-highlightinget l'invite Starship. - Écriture robuste de scripts shell : Création de scripts d'automatisation compatibles POSIX et étendus à Zsh avec manipulation de tableaux et globbing.
- Gestion d'environnements d'entreprise : Gestion des versions SDK, des exports PATH et des alias sur les serveurs macOS et Linux.
Démarrage rapide
1. Configuration minimale ~/.zshrc
# Configuration de l'historique
HISTFILE="$HOME/.zsh_history"
HISTSIZE=50000
SAVEHIST=50000
setopt HIST_IGNORE_DUPS
setopt SHARE_HISTORY
# Raccourcis clavier (mode emacs)
bindkey -e
# Autocomplétion
autoload -Uz compinit && compinit
# Alias
alias ll="ls -lah"
alias g="git"
alias gs="git status -sb"
2. Mesurer le temps de démarrage
# Profiler la durée de démarrage de zsh
time zsh -i -c exit
Concepts fondamentaux
Fichier .zshrc moderne et rapide (~/.zshrc)
Configuration d'un démarrage du shell en moins de 20ms, complétion intelligente et historique :
# ~/.zshrc
# Configuration de l'historique
HISTFILE="$HOME/.zsh_history"
HISTSIZE=50000
SAVEHIST=50000
setopt EXTENDED_HISTORY
setopt HIST_EXPIRE_DUPS_FIRST
setopt HIST_IGNORE_DUPS
setopt HIST_IGNORE_SPACE
setopt HIST_VERIFY
setopt SHARE_HISTORY
# Options de navigation dans les répertoires
setopt AUTO_CD
setopt AUTO_PUSHD
setopt PUSHD_IGNORE_DUPS
setopt PUSHD_SILENT
# Système de complétion rapide (avec cache)
autoload -Uz compinit
typeset -i updated_at=$(date +'%j' -r ~/.zcompdump 2>/dev/null || stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)
if [ $(date +'%j') != $updated_at ]; then
compinit -i
else
compinit -C -i
fi
# Raccourcis clavier modernes : Recherche dans l'historique
bindkey -e
bindkey '^[[A' history-search-backward
bindkey '^[[B' history-search-forward
# Initialisation de l'invite Starship (si installé)
if command -v starship &> /dev/null; then
eval "$(starship init zsh)"
fi
Chargement léger de plugins sans frameworks lourds
Chargement direct des suggestions et de la coloration syntaxique :
# Cloner les plugins vers ~/.zsh/plugins/
# git clone https://github.com/zsh-users/zsh-autosuggestions ~/.zsh/plugins/zsh-autosuggestions
# git clone https://github.com/zsh-users/zsh-syntax-highlighting ~/.zsh/plugins/zsh-syntax-highlighting
source ~/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
source ~/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
# Configurer la couleur des suggestions
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE='fg=8'
Globbing avancé et expansion de paramètres Zsh
Utilisation du globbing récursif et des modificateurs :
# Lister tous les fichiers TypeScript modifiés dans les dernières 24 heures
ls -lh **/*.ts(m-1)
# Supprimer récursivement tous les répertoires vides
rmdir -p **/*(/^F) 2>/dev/null
# Sélectionner uniquement les fichiers exécutables dans bin/
chmod +x bin/*(*)
Schémas courants
Chargement rapide de plugins avec Zinit
Problème : Le démarrage d'Oh My Zsh prend des centaines de millisecondes en raison d'un chargement eager lourd. Solution : Utiliser Zinit en mode turbo (chargement différé).
# Installer Zinit s'il est manquant
source ~/.local/share/zinit/zinit.git/zinit.zsh
# Charger en turbo la coloration syntaxique et les suggestions de manière asynchrone
zinit wait lucid for \
atinit"ZINIT[COMPINIT_OPTS]=-C; zicompinit; zicdreplay" \
zdharma-continuum/fast-syntax-highlighting \
atload"_zsh_autosuggest_start" \
zsh-users/zsh-autosuggestions \
blockf \
zsh-users/zsh-completions
Fonctions de script shell robustes
Problème : Écrire des fonctions shell réutilisables avec analyse des options et gestion des erreurs. Solution : Utiliser les expansions de paramètres Zsh standard.
# mkcd : Créer un répertoire et s'y déplacer
mkcd() {
if [[ -z "$1" ]]; then
echo "Usage : mkcd <dir>" >&2
return 1
fi
mkdir -p "$1" && cd "$1"
}
Bonnes pratiques (2026)
- À faire : Compiler
~/.zcompdumpen un fichier compilé en byte-code (compdump.zwc) pour accélérer le temps de démarrage du shell. - À faire : Définir
setopt SHARE_HISTORYpour synchroniser l'historique des commandes entre tous les onglets de terminal actifs. - À faire : Utiliser Starship ou une invite native légère plutôt que des thèmes d'invite historiques lourds.
- À faire : Profiler la latence de démarrage en utilisant
zmodload zsh/zprofen haut et en bas du fichier~/.zshrc. - À ne pas faire : Utiliser des configurations de framework lourdes et gonflées (configurations monolithiques d'Oh-My-Zsh) avec des dizaines de plugins inutiles.
- À ne pas faire : Stocker des informations d'identification cloud en texte brut, des jetons API ou des secrets dans
~/.zshrc; utiliser des fichiers.envprivés ou des coffres-forts de secrets. - À ne pas faire : Exécuter des commandes externes lentes (
nvm,brew doctor) de manière synchrone à chaque lancement du shell interactif.
Dépannage
| Erreur / Symptôme | Cause | Solution |
|---|---|---|
zsh: command not found: ... après édition du .zshrc | Erreur de syntaxe dans .zshrc ou affectation de $PATH écrasée au lieu d'être préfixée | Préfixer correctement les chemins : export PATH="$HOME/bin:$PATH" et exécuter source ~/.zshrc. |
zsh compinit: insecure directories, run compaudit | Permissions de fichiers non sécurisées sur /usr/local/share/zsh | Exécuter `compaudit |
| Zsh démarre très lentement (> 500ms) | Initialisation synchrone de nvm ou de plugins lourds | Utiliser le chargement différé pour nvm ou profiler avec zmodload zsh/zprof en haut de .zshrc et zprof en bas. |