Des astuces Shell qui rendent vraiment la vie plus facile
(blog.hofstede.it)- 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 + Wsupprime le mot situé avant le curseurCTRL + Ucoupe depuis le curseur jusqu’au début de la ligne, etCTRL + Ypermet de recollerCTRL + Kcoupe 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
resetpuis 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 + Dsur une invite vide, cela ferme le shell - CTRL + L équivaut à la commande
clearpour 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 -eprovoque un arrêt immédiat en cas d’erreurset -udéclenche une erreur lorsqu’une variable non définie est référencée- La combinaison
set -euo pipefailoffre 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
$EDITORet 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.bakmv filename.{txt,md}→mv filename.txt filename.mdmkdir -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 **/*.jscherche 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 + Zpour suspendre →bgpour reprendre en arrière-plan →disownpour 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 de2>&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
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
readlinequi 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 commegdbtui, je me dis qu’une bonne idée ne meurt décidément jamais.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 directementDans zsh, ça se configure comme ceci
.inputrc.inputrcActiver le vim-mode dans le terminal rend les choses bien plus confortables
Une erreur trois mots plus tôt ? Un
3bcwet c’est régléPour tout effacer,
cc, et pour des modifications complexes, on peut ouvrir directement dans (neo)vim avecvSi vous utilisez déjà (neo)vim, c’est idéal car il n’y a pas de nouveaux raccourcis à mémoriser
ctrl-x+eest un bon compromisset -o viJ’ai trouvé impressionnant que quelqu’un ait mis un script
\#dans le PATH pour pouvoir commenter une partie d’un pipeline~/bin/nogloble fichier suivant ce qui m’évite les conflits avec noglob quand j’appelle des scripts zsh depuis bashmycmd1 #| mycmd2$PATHCTRL+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
/du paramètre$WORDCHARS, vous obtenez le comportement voulu (lien de référence)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"push-line-or-edit", et dans bash on peut obtenir quelque chose de proche avecC-upuisC-yctrl-upour sauvegarder et vider la ligne en cours, puisctrl-ypour la recoller. Dans zsh,alt-qpeut automatiser ce processusalt-shift-3permet de préfixer la commande courante avec#puis de passer à une nouvelle ligneJe 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
Dans ma configuration zsh, j’utilise une fonction pour exclure certaines commandes de l’historique
Par exemple, pour éviter qu’une commande dangereuse avec
--forcereste enregistrée dans l’historiqueDans zsh, j’utilise un snippet qui implémente l’expansion automatique des alias globaux
Par exemple, avec
alias -G G='rg -s', saisircommand | Gl’étend automatiquement encommand | rg -sL’expansion se fait automatiquement à la frappe d’un espace, et si on tape
\alias, l’expansion est ignoréeJ’ai une fonction « deep cd » dans
.bashrcElle se déplace automatiquement vers le premier répertoire dont le chemin contient la chaîne passée en argument
Au départ, je pensais que ce serait lent, mais au final je l’utilise bien plus souvent que prévu
jcd’autojump, z ou fzfPour 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.