Aller au contenu

Bonnes pratiques

Sécurité, performance du shell, portabilité et multiplexeurs de terminal.


Sécurité

Ne jamais sourcer .env

Les fichiers .env contiennent des secrets. Ne les sourcez jamais directement dans le shell :

# DANGER — les secrets restent dans l'environnement et l'historique
source .env

# CORRECT — utiliser un outil dedie
# direnv charge/decharge automatiquement les variables par repertoire
brew install direnv
echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc

Avec direnv, un fichier .envrc est charge automatiquement quand vous entrez dans le répertoire et decharge quand vous en sortez :

# .envrc (dans le repertoire du projet)
export DATABASE_URL="postgres://localhost:5432/mydb"
export API_KEY="secret-key"

# Autoriser ce repertoire
direnv allow

Historique

Les commandes contenant des secrets restent dans ~/.zsh_history. Prefixez avec un espace pour les exclure (si HIST_IGNORE_SPACE est active) :

setopt HIST_IGNORE_SPACE
 export SECRET=value  # L'espace initial exclut de l'historique

Vérifier les scripts avant execution

# Ne jamais faire
curl https://example.com/install.sh | sh

# Toujours telecharger et inspecter d'abord
curl -O https://example.com/install.sh
bat install.sh  # Lire le contenu
sh install.sh

Performance du shell

Temps de demarrage

Un shell lent au demarrage est frustrant. Objectif : < 200ms.

# Mesurer le temps de demarrage
time zsh -i -c exit
# real    0.15s ← OK
# real    1.20s ← trop lent

Lazy loading

Charger les outils lourds seulement quand ils sont utilises :

# Au lieu de charger nvm a chaque demarrage (lent)
# export NVM_DIR="$HOME/.nvm"
# [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"

# Lazy load : charge nvm seulement au premier appel
nvm() {
  unfunction nvm
  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"
  nvm "$@"
}

Compilation du .zshrc

# Compiler le .zshrc pour un chargement plus rapide
zcompile ~/.zshrc

Portabilité

Pour des scripts qui doivent fonctionner partout :

  • Utilisez #!/bin/sh (pas #!/bin/zsh) pour les scripts portables
  • Evitez les bashismes ([[ ]], $(( ))) dans les scripts POSIX
  • Testez sur macOS et Linux (les utilitaires GNU vs BSD différent)
# Portable : fonctionne sur tout systeme POSIX
#!/bin/sh
if [ -f "$HOME/.config/app/config" ]; then
  echo "Config trouvee"
fi

# Non portable : syntaxe Bash/Zsh specifique
#!/bin/bash
if [[ -f "$HOME/.config/app/config" ]]; then
  echo "Config trouvee"
fi

Multiplexeurs de terminal

Un multiplexeur permet de :

  • Garder des sessions actives apres deconnexion (SSH)
  • Diviser le terminal en panneaux
  • Organiser les sessions par projet

tmux

# Installation
brew install tmux

# Commandes de base
tmux new -s projet     # Nouvelle session nommee
tmux attach -t projet  # Rejoindre une session
tmux ls                # Lister les sessions

Raccourcis tmux (apres le préfixe Ctrl+B) :

Raccourci Action
c Nouvelle fenêtre
% Split vertical
" Split horizontal
d Detacher la session
n / p Fenêtre suivante / précédente
z Zoom un panneau

Zellij (alternative moderne)

brew install zellij

# Lancer avec un layout par defaut
zellij

Zellij affiche les raccourcis en bas de l'écran — pas besoin de memoriser.

tmux vs Zellij

tmux est le standard etabli avec un ecosysteme massif de plugins. Zellij est plus intuitif pour les debutants. Les deux font le même travail.