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.
!$
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.
Ctrl+a aller au début de la ligne, puis Alt+d supprimer le premier mot.
Je ne sais pas si ce serait effectivement plus rapide ou pas, mais voyez cet article particulièrement le point # .3:
- 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
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 rm
et 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...
En plus de @jjlin answer, les conseils suivants pourraient vous intéresser:
$_
contient le dernier argument de la ligne de commande précédentePour 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 $_
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é.
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 old
par new
et ajoutez extra
name__. Vous pouvez vous arrêter aussi tôt que vous le souhaitez. par exemple. ^old
remplacera old
par la chaîne vide et s'ajoutera à la chaîne vide (essentiellement supprimer old
et 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
à p
de 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.