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 + .?
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.
!$
obtient le dernier élément de l'argument précédent de la ligne de commande.
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.
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.
! ^ peut être la commande pour le premier argument. Je ne sais pas s'il existe un moyen d'obtenir le nième.
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
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 (hello
name__) 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 g
s'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 sed
name__, vi
et 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!
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 bash
name__, le Bourne-Again Shell (un jeu sur sh
name__, 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 ).
! ^ vous obtiendrez le premier paramètre,! $ vous obtiendrez le dernier paramètre,!: n vous obtiendrez le nième élément.
La dernière commande est:
mv foo bar
mv
name__foo
name__mv foo
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
5
4
3
2
1
echo
name__source: https://stackoverflow.com/a/34861762/316312
bind -lp
bindkey -L
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
.