- Shell 100%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
EXTENDED_GLOB (^pattern, ~pattern, (#i)…) n'est utilisé nulle part dans les dotfiles ni les alias. En revanche il transforme grep ^FOO (pattern non-quoté) en glob « tout sauf FOO » → échec silencieux, variables vides, bugs difficiles à diagnostiquer. Pour le globbing avancé on utilise fd/rg/find, pas le shell. |
||
| home | ||
| .gitignore | ||
| install.sh | ||
| packages.txt | ||
| README.md | ||
dotfiles
Configuration shell pour Debian/Ubuntu. Tout vient d'apt — aucun curl | sh,
aucun framework (pas d'oh-my-zsh, pas de TPM), aucune dépendance à compiler.
Déployer sur une machine neuve
git clone <ce-dépôt> ~/.dotfiles
~/.dotfiles/install.sh
exec zsh
Le script installe les paquets, pose les liens symboliques, crée les fichiers
locaux et bascule le shell par défaut. Il est idempotent : relançable sans risque.
Un fichier existant qui gênerait est sauvegardé en .backup-<date>, jamais écrasé.
Contenu
| Fichier | Rôle |
|---|---|
home/.zshrc |
zsh : historique, complétion, raccourcis, alias, aide-mémoire cheat |
home/.tmux.conf |
tmux : préfixe Ctrl-A, souris, découpes | et -, barre de statut |
home/.config/starship.toml |
prompt sur 2 lignes, sans Nerd Font requise |
packages.txt |
la liste des paquets — c'est elle qu'on oublie sinon |
install.sh |
déploiement |
Outils : starship (prompt), fzf (recherche floue), zoxide (z = saut de dossier),
eza / bat / fd / ripgrep (remplaçants de ls / cat / find / grep), procs (complément
de ps, en commande directe — volontairement pas d'alias, voir plus bas).
Universel contre spécifique à la machine
C'est la règle qui fait tenir l'ensemble dans la durée :
- Versionné — ce qui vaut sur n'importe quelle machine.
- Non versionné —
~/.zshrc.localet~/.tmux.conf.local, sourcés en fin de config. Ils vivent dans$HOME, hors de ce dépôt : c'est ce qui les tient à l'écart de git. Le motif*.localdu.gitignoren'est qu'un garde-fou, au cas où l'un d'eux atterrirait un jour danshome/. Étiquette de machine, tokens, chemins propres au serveur, alias liés à un projet hébergé là.
Concrètement, l'étiquette [vps-digi] du prompt et de la barre tmux vient de ces
fichiers locaux. Sur une autre machine, install.sh la remplit avec le hostname
réel — pas de « vps-digi » qui suit d'un serveur à l'autre.
Ne jamais versionner : ~/.ssh/ (clés privées), ~/.zsh_history (contient
souvent des secrets passés en argument), ~/.local/share/zoxide/db.zo, ~/.cache/.
Alias et agents (Claude Code & assimilés)
Ces outils exécutent leurs commandes dans un shell qui source cette config,
via un « shell snapshot » régénéré à chaque session. Le snapshot bash purge les
alias (unalias -a en tête) ; le snapshot zsh, non.
D'où le bloc if [[ -z $CLAUDECODE ]] autour des alias qui remplacent ls et
cat : côté agent, le format de sortie reste celui de coreutils.
Aucun alias de confirmation ici (rm -I, cp -i, mv -i), et c'est
délibéré. Mesuré sur cette machine, l'entrée standard d'un agent n'étant pas un
terminal, la question reçoit EOF — ce qui vaut « non » :
| Commande | Code de sortie | Effet |
|---|---|---|
rm -I sur 1 à 3 fichiers |
0 | supprimés |
rm -I sur 4 fichiers ou plus |
0 | aucun supprimé |
cp -i sur une cible existante |
1 | non écrasée |
Pas de blocage donc, mais pire : un rm qui échoue en annonçant un succès.
set -e ne se déclenche pas, l'appelant enchaîne sur un dossier qu'il croit vide.
Ça vaut au-delà des agents — cron, CI, tout script sourçant cette config. Règle générale : un alias qui rend une commande destructrice dépendante d'un humain est un piège en automatisation, puisque son code de sortie prétend l'inverse.
D'où le bloc conditionnel dans .zshrc :
if [[ -z $CLAUDECODE ]]; then
alias rm='rm -I' # et cp -i, mv -i, ls→eza, cat→bat
fi
La règle générale : tout alias qui pose une question ou change un format de
sortie va dans ce bloc. Les raccourcis inoffensifs (.., gs, df -h) restent
en dehors. À garder en tête en ajoutant un alias.
Exception délibérée : procs n'est pas aliasé sur ps. Contrairement à
eza/bat qui acceptent globalement les mêmes flags que ls/cat, procs a sa propre
syntaxe (ps aux, ps -ef -o pid,cmd n'ont pas d'équivalent direct). Un alias
casserait tout réflexe ou script tapant ps aux | grep foo ou
kill $(ps aux | grep foo | awk '{print $2}'). procs reste donc une commande à
part, jamais un remplacement transparent.
Modifier la config
Les fichiers de $HOME sont des liens vers ce dépôt. Éditer ~/.zshrc édite donc
directement ~/.dotfiles/home/.zshrc — il ne reste qu'à commiter.
cd ~/.dotfiles && git add -A && git commit -m "..." && git push
Mémo
cheat dans le terminal affiche les raccourcis. Il s'adapte au contexte : hors
tmux il rappelle comment démarrer une session, dedans il liste les raccourcis de
panneaux.