Si vous utilisez encore Bash en 2026, vous passez à côté d’une révolution silencieuse. Fish Shell (Friendly Interactive Shell) n’est pas un simple « Bash avec des couleurs » — c’est un shell qui comprend ce que vous voulez faire avant même que vous ayez fini de taper. Combiné à fzf (recherche floue universelle) et Starship (prompt cross-shell ultrarapide), vous obtenez un environnement de développement tellement fluide que vous vous demanderez pourquoi vous ne l’avez pas adopté plus tôt. Voici le guide complet, prêt à utiliser en 30 minutes.

Pourquoi abandonner Bash (ou Zsh avec Oh My Zsh) ?

Bash est partout. C’est sa force et sa faiblesse. Bash est le shell par défaut sur la quasi-totalité des serveurs Linux, et sa compatibilité POSIX en fait le choix « safe » pour les scripts. Mais pour l’usage interactif quotidien, Bash a 35 ans de retard :

  • Pas d’autocomplétion native intelligente : git che ne propose pas checkout. Il faut installer bash-completion, le configurer, et prier.
  • Pas d’autosuggestions : le shell ne devine pas la commande que vous allez taper en se basant sur votre historique.
  • Une syntaxe de script kafkaïenne : les espaces autour des crochets, les guillemets qui mangent les variables, les [[ ]] vs [ ] — Bash est un champ de mines.
  • Zsh + Oh My Zsh corrige une partie de ces défauts, mais au prix de lenteurs notables (le prompt peut mettre 500 ms à s’afficher avec trop de plugins) et d’une configuration fragmentée entre le framework et le shell.

Fish répond à tous ces problèmes out of the box, sans plugin, sans framework, sans configuration. Voici comment.

Installation de Fish Shell

Fish est dans les dépôts de toutes les distributions majeures :

# macOS (Homebrew)
brew install fish

# Ubuntu / Debian
sudo apt install fish

# Fedora
sudo dnf install fish

# Arch Linux
sudo pacman -S fish

# Windows (WSL)
sudo apt install fish

Une fois installé, lancez Fish et faites-en votre shell par défaut :

# Lancer Fish
fish

# Définir Fish comme shell par défaut
chsh -s $(which fish)

# Ou, si vous préférez garder Bash par défaut et lancer Fish manuellement,
# ajoutez ceci à la fin de votre ~/.bashrc :
if command -v fish &> /dev/null; then
  exec fish
fi

Au premier lancement, Fish vous accueille avec une interface web de configuration (fish_config) accessible via http://localhost:8000. Vous pouvez y choisir votre thème de couleurs et explorer les fonctions. Mais le vrai plaisir commence tout de suite dans le terminal.

La magie de Fish : autocomplétion et autosuggestions

Tapez git suivi d’un espace, puis tapez c : Fish vous propose checkout, commit, cherry-pick, clean avec leurs descriptions respectives. Tapez git checkout et Fish affiche la liste de vos branches locales, navigable aux flèches.

Les autosuggestions sont encore plus bluffantes. Tapez ssh et Fish vous suggère en gris clair le dernier serveur auquel vous vous êtes connecté. Un Ctrl+F ou flèche droite et la suggestion est acceptée. Deux frappes pour vous connecter à votre serveur de production au lieu de quinze.

# Exemples d'autosuggestions magiques
ssh mon-serveur-prod        # Suggéré depuis l'historique → Ctrl+F
cd /var/www/mon-super-site  # Suggéré → flèche droite
docker compose up -d         # Suggéré avec tous les flags

Fish complète aussi les options longues avec leurs descriptions. Tapez docker compose -- et Fish liste --detach, --build, --force-recreate avec une explication en ligne. Cette feature seule fait gagner des dizaines de --help par jour.

Les fonctions Fish : vos alias sous stéroïdes

Fish n’utilise pas la syntaxe d’alias de Bash (alias gs='git status'). À la place, il propose les fonctions, plus puissantes et plus propres :

# Créer une fonction Fish (~/.config/fish/functions/gs.fish)
function gs
  git status $argv
end

# Fonction avec comportement conditionnel
function gc
  if test (count $argv) -eq 0
    git commit
  else
    git commit -m "$argv"
  end
end

# Utilisation
gs              # → git status
gc "Fix header"  # → git commit -m "Fix header"

Pour enregistrer une fonction rapidement, utilisez funced (l’éditeur de fonctions interactif) :

funced ma-fonction  # Ouvre l'éditeur
# Écrivez le corps de la fonction, sauvegardez
funcsave ma-fonction  # Persiste dans ~/.config/fish/functions/

fzf : la recherche floue qui transforme tout

fzf (fuzzy finder) est un outil indépendant du shell, écrit en Go, qui ajoute une recherche floue interactive à tout ce qui produit une liste. Combiné à Fish, c’est une bombe de productivité :

# Installation
# macOS
brew install fzf
# Ubuntu/Debian
sudo apt install fzf
# Via mise (gestionnaire de versions universel)
mise install fzf

# Activation dans Fish
echo 'fzf --fish | source' >> ~/.config/fish/config.fish

Les raccourcis indispensables du quotidien :

# Ctrl+R : recherche interactive dans l'historique (remplace history | grep)
# Tapez "docker" et fzf filtre toutes les commandes docker passées

# Ctrl+T : recherche récursive de fichiers dans le répertoire courant
# Sélectionnez un fichier et il est inséré dans la commande

# Alt+C : navigation interactive dans les dossiers
# Tapez, filtrez, et cd directement

Le vrai pouvoir de fzf émerge quand vous le combinez avec d’autres commandes :

# Ouvrir un fichier WordPress avec VSCode (recherche floue dans wp-content)
code (find wp-content -name '*.php' | fzf)

# Tuer un conteneur Docker interactivement
docker ps --format '{{.Names}}' | fzf | xargs docker kill

# Se connecter à une branche Git via recherche floue
git branch | fzf | xargs git checkout

# Chercher et installer un package npm interactivement
npm search (echo '' | fzf --print-query)  # Avancé, nécessite un wrapper

Starship : le prompt qui rend votre terminal magnifique

Starship (starship.rs) est un prompt cross-shell écrit en Rust, conçu pour être :

  • Ultrarapide : affiché en moins de 10 ms, même avec 15 modules activés. Starship est un binaire compilé, pas un script shell.
  • Universel : fonctionne avec Fish, Bash, Zsh, PowerShell, Ion, Elvish, Nushell — changez de shell, gardez votre prompt.
  • Informatif sans être verbeux : affiche la branche Git, l’état du repo, la version Node/Python/PHP du projet, le temps d’exécution de la dernière commande, le niveau de batterie, et une icône quand vous êtes en SSH.

Installation en deux commandes :

# Installation du binaire
brew install starship        # macOS
curl -sS https://starship.rs/install.sh | sh  # Linux
mise install starship        # Alternative via mise

# Activation dans Fish
echo 'starship init fish | source' >> ~/.config/fish/config.fish

Starship se configure via un fichier ~/.config/starship.toml. Voici une configuration de départ pour développeur web :

# ~/.config/starship.toml
# Prompt minimal mais informatif pour développeur web

# Ajoute un saut de ligne avant le prompt
add_newline = true

# Format : modules à gauche, rien à droite
format = """
$username
$hostname
$shlvl
$directory
$git_branch
$git_status
$nodejs
$php
$python
$docker_context
$fill
$cmd_duration
$line_break
$character"""

[directory]
truncation_length = 3
truncate_to_repo = false

[git_branch]
format = "on [$branch](bold purple) "

[git_status]
format = '([[$all_status$ahead_behind]]($style) )'
conflicted = "⚠️"
ahead = "⇡"
behind = "⇣"
stashed = "📦"
modified = "✏️"
staged = "📥"
untracked = "🆕"

[nodejs]
format = "via [🐢 $version](bold green) "

[php]
format = "via [🐘 $version](bold blue) "

[docker_context]
format = "via [🐳 $context](bold cyan) "

[cmd_duration]
format = "a pris [$duration](bold yellow) "
min_time = 3000  # Affiche seulement si > 3 secondes

[character]
success_symbol = "[❯](bold green)"
error_symbol = "[❯](bold red)"

Résultat : un prompt qui affiche ~/w/monsite on main ✏️ 🆕 via 🐘 8.3 via 🐳 default suivi de . En un coup d’œil, vous savez que vous êtes dans votre projet WordPress, sur la branche main, avec des fichiers modifiés et non suivis, en PHP 8.3 sous Docker.

Le trio Fish + fzf + Starship : l’intégration parfaite

Voici le fichier ~/.config/fish/config.fish complet qui assemble les trois outils :

# ~/.config/fish/config.fish
# Configuration Fish + fzf + Starship

# ── Starship (prompt) ──
starship init fish | source

# ── fzf (recherche floue) ──
fzf --fish | source

# Configuration fzf : apparence
set -gx FZF_DEFAULT_OPTS '--height 40% --layout=reverse --border --preview "bat --style=numbers --color=always {}"'

# ── Variables d'environnement ──
set -gx EDITOR code
set -gx VISUAL code

# ── Abréviations (se expandent au lancement) ──
abbr -a g git
abbr -a gc 'git commit -m'
abbr -a gco git checkout
abbr -a dc 'docker compose'
abbr -a dcup 'docker compose up -d'
abbr -a dcdown 'docker compose down'
abbr -a wpcli 'wp --path=/var/www/html'

# ── Raccourcis de navigation ──
function cdsites
  cd ~/Sites $argv
end

# ── Salutation (optionnelle) ──
function fish_greeting
  echo "🐟 Fish $(fish --version | string match -r 'd+.d+.d+') | ⭐ Starship | 🔍 fzf"
  echo "Bienvenue $(whoami), nous sommes le $(date '+%A %d %B %Y')"
end

Avec cette configuration, votre quotidien de développeur change radicalement :

  • Ctrl+R → recherchez n’importe quelle commande passée en tapant quelques lettres
  • Ctrl+T → insérez un chemin de fichier sans le taper
  • d + espace → Fish suggère le dernier dossier visité
  • git ch → complété en git checkout + liste des branches
  • Le prompt vous montre en permanence l’état Git, la version du langage, et le contexte Docker

Astuces avancées pour développeurs WordPress

# Fonction Fish pour wp-cli avec le bon path automatiquement
function wp --wraps='wp'
  if test -f composer.json
    command wp --path=web/wp $argv
  else if test -f wp-config.php
    command wp $argv
  else
    echo "⚠️  Pas de WordPress détecté dans ce dossier"
    return 1
  end
end

# Recherche floue dans les hooks WordPress avec fzf
function wphooks
  rg "add_action|add_filter|do_action|apply_filters" --no-heading | 
    fzf --delimiter : --preview 'bat --style=numbers --color=always {1}'
end

# Navigation rapide dans le thème actif
function cdtheme
  set theme (wp theme list --status=active --field=name 2>/dev/null)
  if test -n "$theme"
    cd "wp-content/themes/$theme"
  else
    cd wp-content/themes
  end
end

Conclusion

Fish Shell n’est pas un énième shell hipster. C’est un gain de productivité mesurable : autocomplétion prédictive, autosuggestions basées sur l’historique, syntaxe de script propre, et configuration zero-plugin. Ajoutez fzf pour la recherche floue interactive et Starship pour un prompt informatif et élégant, et vous obtenez un terminal de développeur qui travaille avec vous plutôt que contre vous.

Le meilleur dans tout ça ? La migration prend 30 minutes, ne casse rien (Bash reste disponible, vos scripts .sh continuent de fonctionner), et vous pouvez revenir en arrière avec un simple chsh -s /bin/bash. Mais honnêtement, après une semaine avec Fish, vous ne voudrez plus jamais taper git checkout en entier.

Sources : Fish Shell — Site officielFish Shell sur GitHubfzf — GitHub officielStarship — Site officielFish Shell — Tutoriel officiel

W
WP Admin Lab

Architecte web full-stack. WordPress, performance, data et sécurité. Notes de terrain, tests reproductibles et retours d'expérience.