Comment puis-je rappeler l'argument de la commande bash précédente?

312

Existe-t-il un moyen dans Bash de rappeler l'argument de la commande précédente?

Je fais habituellement vi file.csuivi par gcc file.c.

Existe-t-il un moyen dans Bash de rappeler l'argument de la commande précédente?

Le codeur
la source
2
Copie

Réponses:

562

Vous pouvez utiliser $_ou !$pour rappeler le dernier argument de la commande précédente.

Alt + .Peut également être utilisé pour rappeler le dernier argument de l'une des commandes précédentes.

codaddict
la source
121
En outre, si vous voulez un argument arbitraire, vous pouvez utiliser !!:1, !!:2etc. ( !!:0est la commande précédente lui - même.) Voir gnu.org/software/bash/manual/bashref.html#History-Interaction
janmoesen
41
Similaire à !$, vous utilisez !^pour le premier argument.
Le
13
ahh ... * nix ... tu es une chose de beauté ... tous les jours je t'aime plus
jx12345
Comment peut-on se référer à l'avant-dernier argument de la commande précédente? par exemple, si j'ai donné echo tiger rabbit, comment puis-je me référer tigerà la commande suivante?
Chan Kim
3
Alt + .ne fonctionne pas en mode vi. Juste pour info, pour les autres qui étaient confus ici.
Brian McCutchon
160

Si la commande précédente avait deux arguments, comme celui-ci

ls a.txt b.txt

et vous vouliez le premier, vous pouvez taper

!:1

donnant

a.txt

Ou si vous vouliez les deux, vous pouvez taper

!:1-2

donnant

a.txt b.txt

Vous pouvez l'étendre à n'importe quel nombre d'arguments, par exemple:

!:10-12
Robert Gowland
la source
@RNA, je viens de l'essayer à nouveau pour m'assurer que je n'ai pas inclus de faute de frappe, pourriez-vous fournir un peu plus de détails (par exemple, ligne de commande ubuntu, cygwin pour Windows? Message d'erreur? Ligne précédente?)
Robert Gowland
J'utilise GNU bash, version 3.2.51 (1) -release (x86_64-apple-darwin13) Copyright (C) 2007 Free Software Foundation, Inc. Le message d'erreur est-bash: :1-2: bad word specifier
RNA
2
J'obtiens la même chose s'il n'y avait pas deux arguments dans la ligne précédente. Par exemple. ligne 1 ls a.txtligne 2ll !:1-2
Robert Gowland
vous avez raison. C'est une stupide erreur que j'ai commise. Merci!
RNA
Également pour obtenir tous les arguments, !:^-$peut être utilisé ou bien sûr un code similaire en combinaison avec des nombres.
816-8055
88

!!:nnest la position 0 de l'argument souhaité.

Par exemple:

echo 'one' 'two'
# "one two"

echo !!:2
# "two"

Le !préfixe est utilisé pour accéder aux commandes précédentes.

Autres commandes utiles:

  • !$ - dernier argument de la commande précédente
  • !^ - premier argument (après le programme / intégré / script) de la commande précédente
  • !! - commande précédente (souvent prononcée "bang bang")
  • !n- numéro nde commande dehistory
  • !pattern - correspondance de commande la plus récente pattern
  • !!:s/find/replace- dernière commande, remplacer findparreplace

Plus d'informations sur l'historique des commandes

Johntron
la source
7
Au lieu de cela !!:s/find/replace, vous pouvez également ^find^replace.
Big McLargeHuge
Aussi: !* - tous les arguments de la commande précédente (après le programme / intégré / script). par exemple: ls *.tmp *.cache rm !*
Aphoid
68

Dans la ligne de commande, vous pouvez appuyer sur esc- .ou alt+.

Il parcourt le dernier argument de vos commandes précédentes.

Antonio Mano
la source
J'ai toujours trouvé que les touches et fonctionnent également.
Bucket
Les clés @Bucket passent par les commandes précédentes, tandis que la solution fournie par Antonio permet de parcourir les arguments précédents (dernier argument de chaque commande précédente uniquement)
everyonesdesign
30

Si vous connaissez le numéro donné dans l'historique pour une commande particulière, vous pouvez à peu près prendre n'importe quel argument de cette commande en utilisant les termes suivants.

Utilisez ce qui suit pour prendre le deuxième argument de la troisième commande de l'historique,

!3:2

Utilisez ce qui suit pour prendre le troisième argument de l'avant-dernière commande de l'historique,

!-5:3

En utilisant un signe moins, vous lui demandez de parcourir la dernière commande de l'historique.

Madisz
la source
19

! * exécute une nouvelle commande avec tous les arguments précédents.

ls /tmp
cd !*
#you are now in /tmp

la source
Cela n'a pas fonctionné pour moi sur OSX - a dû utiliser à la $_place.
Mike W
16

Oui, vous pouvez utiliser !$pour rappeler le dernier argument de la commande précédente.

Justin Ethier
la source
Soyez conscient du mot clé "last", surtout si votre commande contient plusieurs arguments.
Bucket