web-dev-qa-db-fra.com

Comment changer rapidement le premier mot dans une commande Bash?

Je voudrais améliorer un peu mon flux de travail avec Bash et je réalise que je veux souvent exécuter la même commande sur 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 changé):

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 supprimer la première Parole, mais je me demande s’il existe un moyen plus rapide de le faire.

44
nowox

!$ se développe jusqu'au dernier mot de votre commande précédente.

Alors tu pourrais faire:

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

rm !$

ou:

git diff foo/bar.c

git checkout !$

Vos exemples ne répètent que le dernier mot, donc !$ a bien fonctionné. Si vous vouliez répéter un grand nombre d'arguments et que vous souhaitiez simplement modifier le premier mot, vous pouvez utiliser !*, qui étend tous les mots de la commande précédente, à l'exception du zeroth.

Reportez-vous à la section "EXTENSION DE L'HISTORIQUE" de la page de manuel bash. Il y a beaucoup de flexibilité là-bas.

56
Spiff

Ctrl+a aller au début de la ligne, puis Alt+d supprimer le premier mot.

28
jjlin

Je ne sais pas si ce serait effectivement plus rapide ou pas, mais voyez cet article particulièrement le point # .3:

  1. Remplace une chaîne de la commande précédente en utilisant ^ str1 ^ str2 ^

Dans l'exemple suivant, nous avons d'abord exécuté la commande ls pour vérifier un fichier. Plus tard, nous avons réalisé que nous voulions afficher le contenu du fichier. Au lieu de taper à nouveau le nom de fichier complet, nous pouvons simplement remplacer le "ls" dans la commande précédente par "cat" comme indiqué ci-dessous.

$ ls /etc/cron.daily/logrotate

$ ^ls^cat^
cat /etc/cron.daily/logrotate
17
Benguin

Alt+.

Si vous avez seulement besoin de répéter la dernière partie d’une des commandes précédentes, vous pouvez utiliser Alt+. cela collera le dernier argument tiré de la dernière ligne de l'historique.

Si vous appuyez plus d'une fois, ce que vous venez de coller sera remplacé par le dernier argument de la ligne avant ...

Par exemple. si les 2 dernières commandes étaient:

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

Dans le shell, j'écris rmet j'appuie sur Alt+. il apparaîtra:

rm foo/is/a/very/long/path/to/SomeWhereElse.c

si j'appuie à nouveau Alt+. il apparaîtra à la place

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

etc...

15
Hastur

En plus de @jjlin answer, les conseils suivants pourraient vous intéresser:

  • Ctrl+w supprime la Parole à votre gauche
  • Ctrl+k supprime du curseur jusqu'à la fin de la ligne de commande
  • Ctrl+u supprime du curseur au début de la ligne de commande
  • Alt+b déplace le curseur d'un mot vers l'arrière
  • Alt+f déplace le curseur d'un mot vers l'avant
  • $_ contient le dernier argument de la ligne de commande précédente

Pour plus d'informations à ce sujet, consultez la section "Noms de commande Readline" de la page de manuel bash.

par exemple:

cat foo/is/a/very/long/path/to/bar.c
rm $_
11
maiki

Si vous maîtrisez vi, vous pouvez activer les liaisons vi dans bash (la plupart des shells?) En utilisant la commande set -o vi. Ensuite, vous pouvez utiliser les touches vi normales pour éditer votre commande. Dans votre premier exemple, vous pourriez faire ^wcw pour supprimer "diff", puis changez-le pour passer à la caisse.

Il ne vaut peut-être pas la peine d'apprendre les raccourcis clavier vi juste pour éditer la ligne de commande, mais si vous les connaissez déjà, c'est un booster de productivité.

7
Chaosed0

Il y a beaucoup de façons de peler ce chat!

Pour remplacer une chaîne spécifique, ^old^new^extra reprendra votre commande précédente, remplacez oldpar newet ajoutez extraname__. Vous pouvez vous arrêter aussi tôt que vous le souhaitez. par exemple. ^old remplacera oldpar la chaîne vide et s'ajoutera à la chaîne vide (essentiellement supprimer oldet ne plus rien faire).

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

Variante particulièrement utile de ceci:

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 pour faire référence aux mots nà pde la commande m(utilisez des nombres négatifs pour compter à partir de la commande en cours). Vous pouvez omettre la partie -p pour faire référence à un seul mot et omettre la partie :m-p pour faire référence à une commande entière. Des formes spéciales !! pour !-1, !$ pour le dernier mot de la commande précédente et !* pour les arguments (tous sauf Word 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 agréable ici, car appuyer sur onglet étendra les éléments cryptiques pour vous assurer que vous avez bien compris.

Il y a aussi tellement de façons de faire cela avec l'édition en ligne. Lisez sur les raccourcis clavier de votre Shell.

6
Daniel Wagner