45 votes

Comment changer rapidement le premier mot d'une commande Bash ?

J'aimerais améliorer un peu mon flux de travail avec Bash, et je me rends compte que je veux souvent exécuter la même commande dans un exécutable différent.

Quelques exemples :

Git (où je voudrais changer rapidement le deuxième mot) :

git diff     foo/bar.c
git checkout foo/bar.c

Cat/rm (où seul le premier mot doit être modifié) :

cat foo/is/a/very/long/path/to/bar.c
rm  foo/is/a/very/long/path/to/bar.c

Je sais que je peux frapper Ctrl + a puis Del pour supprimer le premier mot, mais je me demande s'il n'y a pas un moyen plus rapide de le faire.

8voto

Chaosed0 Points 181

Si vous maîtrisez vi, vous pouvez activer les liaisons vi dans bash (la plupart des shells ?) en utilisant la commande set -o vi . Vous pouvez ensuite utiliser les touches normales de vi pour éditer votre commande. Dans votre premier exemple, vous pourriez faire ^wcw pour supprimer "diff", puis le remplacer par "checkout".

Il n'est peut-être pas utile d'apprendre les raccourcis clavier de vi juste pour éditer la ligne de commande, mais si vous les connaissez déjà, c'est un gain de productivité appréciable.

6voto

Matt Rae Points 421

Il y a plusieurs façons d'écorcher ce chat !

Pour remplacer une chaîne de caractères spécifique, ^old^new^extra reprendra votre commande précédente, remplacera old con new et ajouter extra . Vous pouvez vous arrêter aussi tôt que vous le souhaitez, par exemple ^old remplacera old avec la chaîne vide et l'ajoute à la chaîne vide (ce qui revient à supprimer old et ne rien faire d'autre).

1. ^diff^checkout
2. ^cat^rm

Variante particulièrement utile :

for i in `seq 1 10`; do echo something complicated; done
# inspect the output to see if it looks right
^echo

Pour remplacer un mot spécifique, vous pouvez utiliser !m:n-p faire référence à des mots n à travers p de la commande m (utiliser des nombres négatifs pour compter à rebours à partir de la commande en cours). Vous pouvez omettre l'élément -p pour se référer à un seul mot, et omettre la partie :m-p pour faire référence à une commande entière. Formes spéciales !! para !-1 , !$ pour le dernier mot de la commande précédente, et !* pour les arguments (tous sauf le mot 0 ) de la commande précédente sont très pratiques.

1. !!:0 checkout !!:2-
2. rm !*

J'utilise souvent les deux ; zsh est particulièrement utile dans ce cas, car en appuyant sur tab, le texte crypté sera développé pour s'assurer que vous l'avez bien compris.

Il existe également de nombreuses façons de procéder avec l'édition en ligne. Renseignez-vous sur les raccourcis clavier de votre Shell.

-2voto

DocSalvager Points 320

La plupart des programmes de terminal prennent en charge...

  • Presse <Up-Arrow> si nécessaire pour réafficher l'une des lignes de commande précédentes dans l'historique.
    • Presse <Down-Arrow> si nécessaire pour avancer dans la liste historique.
  • Presse <Left-Arrow> si nécessaire pour déplacer le curseur à la fin du deuxième mot.
  • Presse <Backspace> si nécessaire pour effacer le deuxième mot.
  • Tapez le deuxième mot de remplacement.
    • Presse <Right-Arrow> / <Left-Arrow> si nécessaire pour se repositionner pour d'autres changements.
  • Frapper <RETURN> pour exécuter la commande

Si la ligne de commande que vous souhaitez obtenir n'est pas récente, effectuez une recherche inversée avec <Ctrl-r> comme décrit dans la question ...
Existe-t-il un moyen d'utiliser ctrl-r après avoir tapé une partie de la commande dans bash ?
Modifiez ensuite à l'aide des touches fléchées si nécessaire.

-3voto

Amarino Points 53

Ce que je fais (Ubuntu/bash) :

1) Arrow up hey pour revenir à la commande précédente
2) Home pour revenir au début
3) Modifier la commande si nécessaire.

Il s'agit d'une méthode infaillible et particulièrement utile pour les commandes à plusieurs lignes.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X