it-swarm.com.de

Wie verwende ich Argumente aus dem vorherigen Befehl?

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 + .?

253
Aman Jain

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.

262

!$ ruft das letzte Element des vorherigen Befehlszeilenarguments ab.

260
user1953081

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.

166

@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.
47
Ajith Antony

! ^ kann der Befehl für das erste Argument sein. Ich bin mir nicht sicher, ob es einen Weg gibt, den n-ten zu bekommen.

19
Orbit

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

11
GuyMatz

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 !


  • ! ist für Veranstaltungen; Das Ereignis kann als Befehlsausgabe oder als in der Befehlsübersicht ausgeführte Operation verstanden werden.

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).

3
user4104817

! ^ erhält den ersten Parameter,! $ den letzten Parameter!! n bringt das n-te Element.

0

So fügen Sie frühere Argumente ein:

  • Alt+.: füge das letzte Argument des letzten Befehls ein (Wiederholen, um in den Verlauf zurückzukehren)
  • Alt+#+.: füge das letzte Argument #nth aus dem letzten Befehl ein (Wiederholen, um in den Verlauf zurückzukehren)
  • Alt+- , # , Alt+., zsh:  Alt+-+#+.: füge das erste Argument #nth aus dem letzten Befehl ein (Wiederholen, um in den Verlauf zurückzukehren)

Beispiel:

Letzter Befehl ist:

mv foo bar
  • Alt++.: erstes Argument des letzten Befehls einfügen = mvname__
  • Alt+2+.: füge das letzte zweite Argument des letzten Befehls ein = fooname__
  • up , Ctrl+w: letzter Befehl ohne das letzte Wort = mv foo

Allgemeine Verknüpfungen

  • Ctrl+w: Entfernt das letzte Wort vom Cursor
  • Ctrl+k: Entfernt alles nach dem Cursor
  • Ctrl+_: letzte Änderung rückgängig machen (sehr nützlich bei Überschreitung Ctrl+w)
  • Ctrl+left: bewegt den Cursor zum letzten Wort
  • Ctrl+right: bewegt den Cursor zum nächsten Wort
  • home oder Ctrl+a: bewegt den Cursor zum Befehlsanfang
  • end oder Ctrl+e: bewegt den Cursor zum Ende des Befehls
  • Ctrl+u: löscht den gesamten Befehl

Durchlaufen der Argumente in einem vorherigen Befehl

funktioniert nur in zsh

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
  • Alt+.: 5
  • Alt+.+:: 4
  • Alt+.+:+:: 3
  • Alt+.+:+:+:: 2
  • Alt+.+:+:+:+:: 1
  • Alt+.+:+:+:+:+:: echoname__

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

Alle verfügbaren Verknüpfungen anzeigen

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

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.

0
nisetama