72 points par GN⁺ 2026-03-27 | 3 commentaires | Partager sur WhatsApp
  • Récapitulatif de différentes combinaisons de raccourcis clavier et de commandes pour gagner en vitesse et en efficacité dans un environnement shell
  • Les raccourcis de base comme CTRL + W, U, K, Y servent à l’édition de ligne, CTRL + A/E, ALT + B/F au déplacement du curseur, et reset permet de restaurer le terminal
  • Dans Bash et Zsh, CTRL + R permet de rechercher dans l’historique des commandes, !!·!$·ESC+. de réutiliser des commandes précédentes, et Brace Expansion ainsi que Globstar d’automatiser les tâches répétitives
  • Des fonctions avancées comme Process Substitution, tee, bg/disown améliorent l’efficacité du contrôle des processus et de la gestion des logs
  • Si l’on maîtrise le shell comme une boîte à outils familière, on gagne en productivité et en concentration ; l’essentiel est d’adopter les raccourcis un par un jusqu’à en faire une habitude

Raccourcis et fonctions de base qui marchent dans presque tous les shells

  • La combinaison CTRL + W, U, K, Y est un ensemble de raccourcis d’édition de ligne qui permet de supprimer ou restaurer rapidement des mots ou des portions de ligne selon la position du curseur

    • CTRL + W supprime le mot situé avant le curseur
    • CTRL + U coupe depuis le curseur jusqu’au début de la ligne, et CTRL + Y permet de recoller
    • CTRL + K coupe depuis le curseur jusqu’à la fin de la ligne
    • CTRL + A / E permet d’aller au début ou à la fin de la ligne, ALT + B / F de se déplacer mot par mot en arrière ou en avant
    • Ces raccourcis sont activés par défaut dans la plupart des terminaux ; sur Mac, il faut configurer la touche Option comme Meta pour qu’ils fonctionnent
    • Les commandes reset ou stty sane permettent de restaurer le terminal lorsqu’un fichier binaire l’a corrompu par erreur à l’affichage
    • Même si l’écran est illisible, la saisie reste possible : tapez reset puis Entrée pour restaurer l’affichage
    • CTRL + C / D servent respectivement à interrompre une commande et à envoyer un signal EOF (fin de fichier)
    • Si l’on appuie sur CTRL + D sur une invite vide, cela ferme le shell
    • CTRL + L équivaut à la commande clear pour nettoyer immédiatement l’écran
    • Cela replace aussi l’invite tout en haut de l’écran tout en conservant la commande en cours de saisie
    • cd - permet de revenir immédiatement au répertoire précédent, et pushd / popd permettent de naviguer entre plusieurs emplacements via une pile de répertoires
    • > file.txt vide un fichier sans le supprimer, ce qui préserve les permissions et le propriétaire
    • La variable $_ permet de réutiliser le dernier argument de la commande précédente
    • Exemple : mkdir -p /path/newdir && cd "$_"
    • set -e, set -u sont des options qui renforcent la sécurité des scripts
    • set -e provoque un arrêt immédiat en cas d’erreur
    • set -u déclenche une erreur lorsqu’une variable non définie est référencée
    • La combinaison set -euo pipefail offre une protection plus robuste

Raccourcis et fonctions avancés dans Bash et Zsh

  • CTRL + R effectue une recherche incrémentale inversée dans l’historique des commandes
    • En saisissant un mot-clé, on peut retrouver immédiatement une commande passée et la réutiliser
  • !! relance intégralement la commande précédente
    • sudo !! permet de relancer la commande précédente avec les droits administrateur
  • CTRL + X, CTRL + E ouvre la commande en cours de saisie dans l’éditeur par défaut (Vim, Nano, etc.) pour modification puis exécution
    • Dans Zsh, une configuration séparée est nécessaire
    • La commande fc est la méthode traditionnelle pour ouvrir une commande précédente dans $EDITOR et la modifier
  • ESC + . ou ALT + . insère à la position du curseur le dernier argument de la commande précédente
    • En répétant le raccourci, on peut faire défiler les arguments de commandes encore plus anciennes
    • !$ fournit la même fonction en mode non interactif
  • Brace Expansion est une fonction d’expansion avec accolades qui réduit les saisies répétitives

    • cp pf.conf{,.bak}cp pf.conf pf.conf.bak
    • mv filename.{txt,md}mv filename.txt filename.md
    • mkdir -p project/{src,tests,docs} crée plusieurs répertoires à la fois
    • Process Substitution <(command) traite la sortie d’une commande comme s’il s’agissait d’un fichier
    • Exemple : diff <(sort file1.txt) <(sort file2.txt) permet une comparaison sans fichier temporaire
    • Globstar(**) permet de rechercher récursivement des fichiers dans les sous-répertoires
    • Dans Bash, on l’active avec shopt -s globstar, alors que dans Zsh il est activé par défaut
    • Exemple : ls **/*.js cherche les fichiers JS dans tous les sous-dossiers
  • La combinaison CTRL + Z, bg, disown permet d’exécuter un processus en arrière-plan puis de le détacher du shell

    • CTRL + Z pour suspendre → bg pour reprendre en arrière-plan → disown pour le détacher du shell
    • Le processus peut ainsi continuer même après la fermeture de la session SSH
    • command |& tee file.log envoie à la fois la sortie standard (stdout) et la sortie d’erreur (stderr) dans un pipe
    • |& est la forme abrégée de 2>&1 |
    • Avec tee, on peut à la fois afficher la sortie à l’écran et l’enregistrer dans un log

Conseils essentiels pour bien exploiter le shell

  • Le shell est une boîte à outils et, lorsqu’on le maîtrise bien, il peut fortement améliorer la productivité
  • Il est plus efficace d’adopter les raccourcis un par un que de vouloir tous les apprendre d’un coup
  • Réduire les saisies répétitives et la frappe inutile permet de simplifier le flux de travail
  • Une fois à l’aise, le terminal n’est plus un obstacle mais votre propre espace de travail

3 commentaires

 
phoon 2026-03-30

Ce sont presque tous des raccourcis Emacs, mais on parle à peine d’Emacs ; voir qu’ils sont aujourd’hui largement partagés comme de simples astuces me donne vraiment le sentiment qu’une époque a changé. C’est la bibliothèque readline qui a implémenté partout ces raccourcis Emacs. J’ai l’impression que cela fait presque 20 ans que tout est passé aux IDE, mais du point de vue d’un fossile qui utilisait encore des choses comme gdbtui, je me dis qu’une bonne idée ne meurt décidément jamais.

 
GN⁺ 2026-03-27
Réactions sur Hacker News
  • Le moment où j’ai eu l’impression que ma vie avait changé, c’est quand j’ai remappé la flèche du haut
    Maintenant, au lieu de parcourir toutes les commandes, je ne cherche que celles qui commencent par ce que j’ai déjà tapé
    Par exemple, si j’entre tar - puis j’appuie sur la flèche du haut, les options tar utilisées précédemment apparaissent directement
    Dans zsh, ça se configure comme ceci

    bindkey "^[OA" up-line-or-beginning-search # Up  
    bindkey "^[OB" down-line-or-beginning-search # Down
    
    • Une fois qu’on commence à utiliser CTRL+r, on n’utilise plus jamais la flèche du haut
    • Je considère ça comme un vrai game changer. Pour obtenir quelque chose de similaire dans bash, ajoutez ceci à .inputrc
      "\e[A":history-search-backward  
      "\e[B":history-search-forward
      
    • Dans fish shell, c’est le comportement par défaut. On parcourt les commandes avec les flèches haut/bas à partir du mot déjà saisi, et on peut même parcourir seulement les arguments avec alt+haut/bas
    • On peut obtenir le même résultat aussi dans .inputrc
    • Moi, je laisse les flèches haut/bas telles quelles et je configure plutôt ctrl+p et ctrl+n de cette façon
  • Activer le vim-mode dans le terminal rend les choses bien plus confortables
    Une erreur trois mots plus tôt ? Un 3bcw et c’est réglé
    Pour tout effacer, cc, et pour des modifications complexes, on peut ouvrir directement dans (neo)vim avec v
    Si vous utilisez déjà (neo)vim, c’est idéal car il n’y a pas de nouveaux raccourcis à mémoriser

    • Ça me rappelle un passage d’un ancien manuel Emacs. Au lieu de commandes compliquées, j’aurais envie de recommander une configuration de la souris
    • J’utilise (n)vim depuis plus de 20 ans, mais je n’aime pas le vi-mode du shell. Quand j’ai besoin de commandes complexes, ouvrir dans neovim avec ctrl-x+e est un bon compromis
    • J’utilise souvent vim moi aussi, mais pas dans le shell. À la place, j’utilise les raccourcis de style Emacs (ctrl-a, ctrl-e, etc.) partout dans macOS. J’aimerais que vim prenne en charge les bindings emacs en mode insertion
    • C’est la première fois que j’entends le nom de cette fonctionnalité, « readline vi-mode ». Je vais creuser
    • Je ne comprends pas pourquoi le mode emacs est activé par défaut. Quand j’ouvre un nouveau shell, la première chose que je tape, c’est set -o vi
  • J’ai trouvé impressionnant que quelqu’un ait mis un script \# dans le PATH pour pouvoir commenter une partie d’un pipeline

    #!/bin/sh
    cat
    
    • J’utilise un truc similaire. J’ai dans ~/bin/noglob le fichier suivant
      #!/bin/sh
      $*
      
      ce qui m’évite les conflits avec noglob quand j’appelle des scripts zsh depuis bash
    • Moi, j’utilise les commentaires entre parenthèses. C’est bien pour documenter des scripts, mais en shell interactif c’est pénible. Cela dit, c’est une façon créative de commenter et c’est amusant
    • Je me demande quel avantage cela a par rapport à mycmd1 #| mycmd2
    • C’est vraiment utile, je vais l’ajouter à mon $PATH
  • CTRL+W supprime généralement jusqu’à l’espace précédent, donc ça efface tout /var/log/nginx/
    Alt+Backspace supprime jusqu’au caractère non alphabétique précédent
    Attention cependant, car cela peut entrer en conflit avec le raccourci pour fermer un onglet du navigateur

    • Depuis Firefox v147, il est possible de redéfinir les raccourcis. Lien connexe
    • Sur macOS, les raccourcis GUI et ceux du terminal sont séparés, donc ce problème n’existe pas. ⌘C, ⌘W, etc. fonctionnent de la même façon dans le terminal
    • Dans mon environnement (fish + Alacritty), c’est l’inverse. Heureusement, je peux restaurer un onglet fermé avec Ctrl-Shift-T
    • Si vous retirez / du paramètre $WORDCHARS, vous obtenez le comportement voulu (lien de référence)
    • On peut restaurer immédiatement l’onglet avec Ctrl-Shift-T
  • Je recommande d’améliorer la recherche dans l’historique avec l’intégration shell de fzf
    Vidéo de démonstration / Documentation officielle

  • J’ai une astuce que j’utilise souvent
    Quand je suis en train de taper une longue commande mais que je dois faire autre chose avant, au lieu d’annuler avec Ctrl-C, je l’exécute commentée pour qu’elle reste dans l’historique

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • Dans zsh, c’est possible avec le binding "push-line-or-edit", et dans bash on peut obtenir quelque chose de proche avec C-u puis C-y
    • Une méthode plus simple consiste à utiliser ctrl-u pour sauvegarder et vider la ligne en cours, puis ctrl-y pour la recoller. Dans zsh, alt-q peut automatiser ce processus
    • Dans bash, alt-shift-3 permet de préfixer la commande courante avec # puis de passer à une nouvelle ligne
  • Je n’aime pas trop le titre façon LLM, mais certaines astuces sont utiles et je vais les essayer
    C’est dommage que la brace expansion s’accorde mal avec l’autocomplétion par tabulation. J’aimerais qu’il existe aussi des fonctions comme la duplication du dernier token ou la suppression de l’extension d’un fichier

    • Le style du texte lui-même fait aussi très LLM. Par exemple, des phrases comme « The shell is a toolbox, not an obstacle course. »
    • PowerShell a aussi un mode readline, ce qui réduit la friction quand on alterne avec WSL
    • readline se comporte comme une partie de bash, donc je pense qu’il est raisonnable d’appeler ces astuces des fonctionnalités du shell
  • Dans ma configuration zsh, j’utilise une fonction pour exclure certaines commandes de l’historique
    Par exemple, pour éviter qu’une commande dangereuse avec --force reste enregistrée dans l’historique

    function zshaddhistory() {
      emulate -L zsh
      if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then
        print -sr -- "${1%%$'\n'}"
        fc -p
      else
        return 1
      fi
    }
    
    • Je fais quelque chose de similaire aussi, en créant un alias qui ajoute un espace au début des commandes à ne pas enregistrer
      unhist () { alias $1=" $1"; }
      unhist unhist
      unhist fzf
      unhist rghist
      
  • Dans zsh, j’utilise un snippet qui implémente l’expansion automatique des alias globaux
    Par exemple, avec alias -G G='rg -s', saisir command | G l’étend automatiquement en command | rg -s
    L’expansion se fait automatiquement à la frappe d’un espace, et si on tape \alias, l’expansion est ignorée

  • J’ai une fonction « deep cd » dans .bashrc
    Elle se déplace automatiquement vers le premier répertoire dont le chemin contient la chaîne passée en argument

    dcd() {
      [ -z "$1" ] && return
      local dir
      dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null)
      [ -n "$dir" ] && cd "$dir"
    }
    

    Au départ, je pensais que ce serait lent, mais au final je l’utilise bien plus souvent que prévu

    • Ça vaut aussi le coup de regarder des outils de cd intelligents comme jc d’autojump, z ou fzf
 
phoon 2026-03-30

Pour ce remappage de la flèche du haut ci-dessus, les utilisateurs d’Emacs font simplement ça avec c-r. Au bout du tuning, on revient au réglage d’origine.