Ich weiß das Esc + . gibt Ihnen das letzte Argument des letzten Befehls.
Aber ich interessiere mich für das erste Argument des letzten Befehls. Gibt es dafür eine Schlüsselbindung?
Gibt es in den gleichen Zeilen eine generische Möglichkeit, das n-te Argument aus dem letzten Befehl abzurufen? Ich weiß, dass Sie in einem Bash-Skript $0
, $1
usw. verwenden können, aber diese funktionieren nicht in der Befehlszeile.
Wie wäre es auch mit dem Durchlaufen des 0. Arguments vorheriger Befehle, so wie wir es mit dem letzten Argument tun können, indem wir kontinuierlich drücken Esc + .?
Ebenso wie M-.
(Meta-Punkt oder Esc-Punkt oder Alt-Punkt) die Readline-Funktion yank-last-arg
ist, ist M-C-y
(Meta-Control-Y oder Esc-Strg-Y oder Strg-Alt-Y) die Readline-Funktion yank-nth-arg
. Ohne Angabe von n
wird das erste Argument des vorherigen Befehls ignoriert.
Um ein Argument anzugeben, drücken Sie Escape und eine Zahl oder halten Sie die Alt-Taste gedrückt und drücken Sie eine Zahl. Du kannst tun Alt--um mit der Angabe einer negativen Zahl zu beginnen, lassen Sie Alt los und drücken Sie die Ziffer (dies wird vom Ende der Liste der Argumente an gezählt).
Beispiel:
Geben Sie den folgenden Befehl ein
$ echo a b c d e f g
a b c d e f g
Geben Sie nun an der nächsten Eingabeaufforderung echo
(mit einem Leerzeichen) ein
Drücken Sie Alt-Ctrl-y und du wirst jetzt sehen:
$ echo a
ohne zu drücken Enter Führen Sie dennoch die folgenden Schritte aus
Drücken Sie Alt-3Alt-Ctrl-y
Drücken Sie Alt--2Alt-Ctrl-y
Nun werden Sie sehen:
$ echo ace
Übrigens hätten Sie den echo
in die Zeile setzen können, indem Sie das Argument 0 auswählen:
Drücken Sie Alt-Alt-Ctrl-y
Bearbeiten:
So beantworten Sie die Frage, die Sie Ihrem Original hinzugefügt haben:
Sie können drücken Alt- dann wiederholt drücken Alt-. um die vorherigen Befehle durchzugehen (arg 0). Ähnlich Alt-- dann wiederholen Alt-. Hiermit können Sie die vorletzten Argumente durchgehen.
Wenn es in einer bestimmten Zeile im Verlauf kein angemessenes Argument gibt, wird die Glocke geläutet.
Wenn Sie eine bestimmte Kombination häufig verwenden, können Sie ein Makro definieren, damit es per Tastendruck ausgeführt wird. In diesem Beispiel wird das zweite Argument aus vorherigen Befehlen durch Drücken von aufgerufen Alt-Shift-Y. Sie können jeden verfügbaren Tastendruck wählen, den Sie bevorzugen. Sie können wiederholt darauf drücken, um die vorherigen zu durchlaufen.
Um es auszuprobieren, geben Sie das Makro an einer Bash-Eingabeaufforderung ein:
bind '"\eY": "\e2\e."'
Fügen Sie diese Zeile zu Ihrer ~/.inputrc
-Datei hinzu, um sie dauerhaft zu machen:
"\eY": "\e2\e."
Leider scheint dies nicht für Argument 0 oder negative Argumente zu funktionieren.
!$
ruft das letzte Element des vorherigen Befehlszeilenarguments ab.
Um das erste Argument zu verwenden, können Sie !^
oder !:1
verwenden.
Beispiel:
$ 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
Da Ihre Frage die Verwendung anderer Argumente betrifft, sind hier einige nützliche Argumente:
!^ 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
Die ersten vier Formen werden häufiger verwendet. Das Formular !:2-
ist etwas kontraintuitiv, da es nicht das letzte Argument enthält.
@Larsmans antwortete so gut, dass ich mehr lernen musste. Fügen Sie diese Antwort hinzu, damit andere den Manpage-Abschnitt finden und wissen können, wofür er zu tun istgoogle:
$ 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.
! ^ kann der Befehl für das erste Argument sein. Ich bin mir nicht sicher, ob es einen Weg gibt, den n-ten zu bekommen.
Sie können auch Argumente aus jedem Befehl in Ihrer Historie erhalten!
$ 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
Grundsätzlich hat es eine Verwendung in Yanking vorherige (Befehl) Argumente .
Zum Beispiel, wenn der folgende Befehl ausgegeben wird:
echo Hello, world how are you today?
dann ist Hello,
das erste Argument und today?
das sechste , das ist das letzte; Das heißt, es kann referenziert werden, indem Sie Folgendes eingeben:
Alt+6 gefolgt von Ctrl-Alt-6
Ctrl wird traditionell als Hutzeichen ^
vor Schlüsselnamen bezeichnet, und Alt als M-
das ist M etaPräfix.
Die obige Verknüpfung kann also als ^My
to yank neu definiert werden.
Außerdem gibt es in der Befehlszeile die Verknüpfung hatssubstitution:
echo Hello, world!
^Hello^Bye
Bye, world!
um den vorherigen Befehl zu ersetzen erste übereinstimmende Zeichenfolge , was bedeutet:
Hello, world! Hello, people!
^Hello^Bye
würde ergeben:
Bye, world! Hello, people!
lassen Sie die zweite Übereinstimmung (hello
) unverändert.
Hinweis: Lassen Sie kein Leerzeichen zwischen den Hüten , sonst funktioniert die Operation nicht.
Das Obige ist nur eine Abkürzung für:
!:s/Hello/Bye
ersetzung auf Ereignisebene (*) für die erste gefundene (übereinstimmende) Zeichenfolge im vorherigen Befehl, während der erste Teil mit dem Schalter g
vorangestellt wird, gilt für die gesamte Zeile g lobally:
echo Hello, world! Hello, people!
!:gs/Hello/Bye
Bye, world! Bye, people!
dies geschieht normalerweise in anderen verwandten Befehlen wie sed
, vi
und regex
(regulärer Ausdruck) - eine Standardmethode für die Suche ( match string).
Nein, Sie können
!:sg/Hello/Bye
oder!:s/Hello/Bye/g
hier nicht ausführen, das ist die Syntax !
Das habe ich verstanden, indem ich es selbst verwendet und Dinge aus verschiedenen Quellen, einschließlich Handbuchseiten, Blogs und Foren, ausprobiert habe.
Hoffe, es wird ein wenig Licht in die mysteriösen Möglichkeiten von bash
, der Bourne-Again-Shell (ein Spiel auf der sh
-Shell, die nach dem Nachnamen ihres Erfinders selbst Bourne-Shell heißt), die in vielen Distributionen, einschließlich Servern ( Server-Betriebssysteme).
! ^ erhält den ersten Parameter,! $ den letzten Parameter!! n bringt das n-te Element.
Letzter Befehl ist:
mv foo bar
mv
name__foo
name__mv foo
führe das aus oder füge es deinem ~/.zshrc
hinzu
autoload -Uz copy-earlier-Word
zle -N copy-earlier-Word
bindkey "^[:" copy-earlier-Word
Jetzt benutzen Alt+. um so zurück zu gehen wie du willst, dann benutze Alt+: die Argumente durchlaufen
Angenommen, der letzte Befehl lautet
echo 1 2 3 4 5
5
4
3
2
1
echo
name__quelle: https://stackoverflow.com/a/34861762/316312
bind -lp
bindkey -L
Die am Ende der akzeptierten Antwort beschriebene Methode funktioniert für mich auch mit dem nullten Argument. Ich habe diese Zeilen in meinem ~/.inputrc
:
"\en": "\e0\e."
"\em": "\e1\e."
"\e,": "\e2\e."
\e2\e.
hat gegenüber \e2\e\C-y
den Vorteil, dass es die vorherigen Befehle durchläuft, wenn es wiederholt gedrückt wird, anstatt das zweite Argument des vorherigen Befehls mehrmals einzufügen.
Um den gesamten vorherigen Befehl einzufügen, können Sie !!\e^
eingeben. \e^
ist history-expand-line
.