web-dev-qa-db-fra.com

Comment utiliser les arguments de la commande précédente?

Je le sais Esc + . vous donne le dernier argument de la dernière commande.

Mais je suis intéressé par le premier argument de la dernière commande. Y a-t-il une liaison clé pour le faire?

Dans le même ordre d'idées, existe-t-il un moyen générique d'obtenir le nième argument de la dernière commande? Je sais que dans un script bash, vous pouvez utiliser $0, $1 etc., mais cela ne fonctionne pas sur la ligne de commande.

Et aussi, qu'en est-il de l'itération à travers le 0ème argument des commandes précédentes, comme nous pouvons le faire avec le dernier argument en appuyant continuellement sur Esc + .?

253
Aman Jain

Tout comme M-. (méta-point ou esc-point ou alt-point), la fonction readline yank-last-arg, M-C-y (méta-contrôle-y ou esc-ctrl-y ou ctrl-alt-y) est la fonction readline yank-nth-arg. Sans spécifier n, il extrait le premier argument de la commande précédente.

Pour spécifier un argument, appuyez sur Échap et un nombre ou maintenez la touche Alt enfoncée et appuyez sur un nombre. Tu peux faire Alt--pour commencer en spécifiant un nombre négatif, relâchez Alt et appuyez sur le chiffre (cela comptera à partir de la fin de la liste des arguments.

Exemple:

Entrez la commande suivante

$ echo a b c d e f g
a b c d e f g

Maintenant, à la prochaine invite, saisissez echo (avec un espace), puis

Presse Alt-Ctrl-y et vous verrez maintenant:

$ echo a

sans appuyer Enter pourtant, faites ce qui suit

Presse Alt-3Alt-Ctrl-y

Presse Alt--2Alt-Ctrl-y

Maintenant, vous verrez:

$ echo ace

En passant, vous auriez pu mettre le echo sur la ligne en sélectionnant l’argument 0:

Presse Alt-Alt-Ctrl-y

Edit:

Pour répondre à la question que vous avez ajoutée à votre original:

Vous pouvez appuyer sur Alt- puis appuyez plusieurs fois sur Alt-. pour parcourir les commandes précédentes (arg 0). De même Alt-- puis en répétant Alt-. vous permettrait de passer en revue l’avant-dernier argument précédent.

S'il n'y a pas d'argument approprié sur une ligne particulière de l'histoire, la cloche sonne.

Si vous utilisez fréquemment une combinaison particulière, vous pouvez définir une macro pour qu’elle soit exécutée par une frappe. Cet exemple rappellera le deuxième argument des commandes précédentes en appuyant sur Alt-Shift-Y. Vous pouvez choisir n'importe quelle frappe disponible que vous préférez au lieu de celle-ci. Vous pouvez appuyer plusieurs fois sur cette touche pour parcourir les précédentes.

Pour l'essayer, entrez la macro à l'invite Bash:

bind '"\eY": "\e2\e."'

Pour le rendre persistant, ajoutez cette ligne à votre fichier ~/.inputrc:

"\eY": "\e2\e."

Malheureusement, cela ne semble pas fonctionner pour arg 0 ou des nombres d'arguments négatifs.

262
Dennis Williamson

!$ obtient le dernier élément de l'argument précédent de la ligne de commande.

260
user1953081

Pour utiliser le premier argument, vous pouvez utiliser !^ ou !:1

Exemple:

$ echo a b c d e 
a b c d e
$ echo !^
echo a
a

$ echo a b c d e 
a b c d e
$ echo !:1
echo a
a

Puisque votre question concerne l’utilisation d’autres arguments, voici quelques conseils utiles:

!^      first argument
!$      last argument
!*      all arguments
!:2     second argument

!:2-3   second to third arguments
!:2-$   second to last arguments
!:2*    second to last arguments
!:2-    second to next to last arguments

!:0     the command
!!      repeat the previous line

Les quatre premières formes sont plus souvent utilisées. Le formulaire !:2- est quelque peu contre-intuitif, car il n'inclut pas le dernier argument.

166

J'ai aimé @larsmans répondre tellement j'ai dû apprendre plus. En ajoutant ceci Answer pour aider les autres utilisateurs à trouver la section de la page de manuel et à savoir pourquoi

$ man  -P 'less -p ^HISTORY\ EXPANSION' bash
<...>
Word Designators

Word designators are used to select desired words from the event.
A : separates the event specification from the Word designator.
It may be omitted if the Word designator begins with a ^, $, *, -,
or %.  Words are numbered from the beginning of the line, with the
first Word being denoted by 0 (zero).  Words are inserted into the
current line separated by single spaces.

   0 (zero)
          The zeroth Word.  For the Shell, this is the command Word.
   n      The nth Word.
   ^      The first argument.  That is, Word 1.
   $      The last argument.
   %      The Word matched by the most recent ‘?string?’ search.
   x-y    A range of words; ‘-y’ abbreviates ‘0-y’.
   *      All of the words but the zeroth.
          This is a synonym for ‘1-$’.  
          It is not an error to use * if there is just one Word in
          the event; the empty string is returned in that case.
   x*     Abbreviates x-$.
   x-     Abbreviates x-$ like x*, but omits the last Word.

   If a Word designator is supplied without an event
   specification, the previous command is used as the event.
47
Ajith Antony

! ^ peut être la commande pour le premier argument. Je ne sais pas s'il existe un moyen d'obtenir le nième.

19
Orbit

Vous pouvez également obtenir des arguments à partir de n’importe quelle commande de votre historique!


$ echo a b c d e f g
a b c d e f g
$ echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar
$ history | tail -5
  601  echo build/libs/jenkins-utils-all-0.1.jar
  602  history | tail -10
  603  echo a b c d e f g
  604  echo build/libs/jenkins-utils-all-0.1.jar
  605  history | tail -5
$ echo !-3:4
echo d
d
$ echo !604:1
echo build/libs/jenkins-utils-all-0.1.jar
build/libs/jenkins-utils-all-0.1.jar

11
GuyMatz

Fondamentalement, il a une utilisation dans yanking précédent (commande) arguments.

Par exemple, si la commande suivante est émise:

echo Hello, world how are you today?

alors, Hello, sera le premier argument, et today? le sixième, qui est le dernier; ce qui signifie qu'il peut être référencé en tapant:

Alt+6 suivi par Ctrl-Alt-6


Ctrl est traditionnellement désigné par un caractère de chapeau ^ ajouté aux noms de touches, et Alt comme M- c'est M eta préfixe.

Ainsi, le raccourci ci-dessus peut être redéfini en tant que ^My to yank.


De plus, il y a chapeaux un raccourci de substitution dans la ligne de commande:

echo Hello, world!

^Hello^Bye

Bye, world!

pour remplacer la commande précédente première chaîne correspondante, ce qui signifie:

Hello, world! Hello, people!

^Hello^Bye

aboutirait à:

Bye, world! Hello, people!

en laissant la deuxième correspondance (helloname__) inchangée.

Remarque: Ne laissez pas espace entre les chapeaux, ou l'opération ne fonctionnera pas.


Ce qui précède n’est qu’un raccourci pour:

!:s/Hello/Bye

la substitution au niveau de l'événement (*) de la première chaîne trouvée (correspondante) dans la commande précédente, tandis que le préfixe de la première partie avec le commutateur gs'appliquera à toute la ligne g globalement :

echo Hello, world! Hello, people!

!:gs/Hello/Bye

Bye, world! Bye, people!

comme cela se fait habituellement dans d'autres commandes connexes telles que sedname__, viet regex(expression régulière) - une méthode standard de recherche ( correspondant à la chaîne ).

Non, vous ne pouvez pas faire !:sg/Hello/Bye ou !:s/Hello/Bye/g ici, c’est la syntaxe!


  • ! est pour les événements; event peut être compris comme une sortie de commande ou une opération effectuée dans l'historique des commandes.

C'est ce que j'ai compris en l'utilisant moi-même et en essayant moi-même des choses à partir de ce que j'ai lu de différentes sources, notamment des pages de manuel, des blogs et des forums.

J'espère qu'il dévoilera un mystérieux moyen de bashname__, le Bourne-Again Shell (un jeu sur shname__, appelé lui-même Bourne Shell après le nom de famille de son inventeur), qui est le shell par défaut dans de nombreuses distributions incluant des serveurs ( le système d'exploitation du serveur ).

3
user4104817

! ^ vous obtiendrez le premier paramètre,! $ vous obtiendrez le dernier paramètre,!: n vous obtiendrez le nième élément.

0

Pour insérer les arguments précédents:

  • Alt+.: insère le dernier argument de la dernière commande (répète pour revenir en arrière dans l’historique)
  • Alt+#+.: insère #nth dernier argument de la dernière commande (à répéter pour revenir en arrière dans l’historique)
  • Alt+- , # , Alt+., zsh:  Alt+-+#+.: insère le premier argument de la dernière commande (à répéter pour revenir en arrière dans l’historique)

Exemple:

La dernière commande est:

mv foo bar
  • Alt++.: insère le premier argument de la dernière commande = mvname__
  • Alt+2+.: insère le dernier 2ème argument de la dernière commande = fooname__
  • up , Ctrl+w: dernière commande sans le dernier mot = mv foo

Raccourcis généraux

  • Ctrl+w: supprime le dernier mot du curseur
  • Ctrl+k: supprime tout après le curseur
  • Ctrl+_: annuler la dernière modification (très utile pour dépasser Ctrl+w)
  • Ctrl+left: déplace le curseur sur le dernier mot
  • Ctrl+right: déplace le curseur sur le prochain mot
  • home ou Ctrl+a: déplace le curseur au début de la commande
  • end ou Ctrl+e: déplace le curseur à la fin de la commande
  • Ctrl+u: efface toute la commande

Pour parcourir les arguments d'une commande précédente

ne fonctionne qu'en zsh

lancez ou ajoutez ceci à votre ~/.zshrc

autoload -Uz copy-earlier-Word
zle -N copy-earlier-Word
bindkey "^[:" copy-earlier-Word

Maintenant utiliser Alt+. pour aller aussi loin que vous voulez, puis utilisez Alt+: parcourir les arguments

En supposant que la dernière commande est

echo 1 2 3 4 5
  • Alt+.: 5
  • Alt+.+:: 4
  • Alt+.+:+:: 3
  • Alt+.+:+:+:: 2
  • Alt+.+:+:+:+:: 1
  • Alt+.+:+:+:+:+:: echoname__

source: https://stackoverflow.com/a/34861762/316312

Pour voir tous les raccourcis disponibles

  • bash: bind -lp
  • zsh: bindkey -L
0
Madacol

La méthode décrite à la fin de la réponse acceptée fonctionne également avec l'argument zeroth pour moi. J'ai ces lignes dans mon ~/.inputrc:

"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."

\e2\e. a l'avantage sur \e2\e\C-y de parcourir les commandes précédentes si vous appuyez plusieurs fois de suite au lieu d'insérer plusieurs fois le deuxième argument de la commande précédente.

Pour insérer toute la commande précédente, vous pouvez taper !!\e^. \e^ est history-expand-line.

0
nisetama