Was bedeutet! $?

Ich folge einem Tutorial und es wird erwähnt, dass dieser Befehl ausgeführt werden soll:

sudo chmod 700 !$ 

Ich kenne !$ nicht. Was bedeutet das?

Kommentare

  • ' ist im Allgemeinen sicher, echo etwas, wenn Sie ' nicht sicher sind, was ' tun wird.
  • @Shadur, nicht immer. echo $(rm -rf /)
  • @cjm Wenn Sie ' nicht auf einem wirklich alten System sind, ' benötigt dort die Option --no-preserve-root, und wenn Sie die Wörter " sehen, wird In einem Programm sollten Sie besser genau überlegen, was es tut.
  • @WChargin Seien Sie sehr vorsichtig, wenn Sie davon ausgehen, dass " wirklich alt " und " nicht Linux / keine Verwendung von GNU-Coreutils " sind dasselbe; Sie sind nicht ' t.

Antwort

Grundsätzlich ist es „s das letzte Argument zum vorherigen Befehl.

!$ ist das“ Ende „des vorherigen Befehls Betrachten Sie das folgende Beispiel: Wir suchen zunächst nach einem Wort in einer Datei:

grep -i joe /some/long/directory/structure/user-lists/list-15 

Wenn Joe in dieser Benutzerliste ist, möchten wir ihn daraus entfernen Wir können vi entweder mit diesem langen Verzeichnisbaum als Argument oder einfach als vi !$ starten. Welche Bash erweitert sich zu:

vi /some/long/directory/structure/user-lists/list-15 

( source ; handliche Anleitung übrigens)


Die Unterscheidung zwischen diesem !$ -Token und der speziellen Shell-Variablen $_ ist nichts wert . In der Tat erweitern beide das letzte Argument des vorherigen Befehls. !$ wird jedoch während der Verlaufserweiterung erweitert, während $_ während der Parametererweiterung . Eine wichtige Folge davon ist, dass bei Verwendung von !$ der Befehl erweitert in Ihrem Verlauf gespeichert wird.

Zum Beispiel Betrachten Sie die Tastenanschläge

  • echo Foo Geben Sie echo !$ Jar Enter Up Enter ; und

  • echo Foo Geben Sie echo $_ Jar ein Geben Sie Up Enter ein.

(Die einzigen geänderten Zeichen sind $! und $_ in der Mitte.)

Im ersten Fall, wenn Sie Up drücken, die Befehlszeile liest echo Foo Jar, daher lautet die letzte in stdout geschriebene Zeile Foo Jar.

In letzterem Fall, wenn Sie Nach oben lautet die Befehlszeile echo $_ bar, aber jetzt hat $_ einen anderen Wert als zuvor – in der Tat $_ ist jetzt Jar, daher lautet die letzte in stdout geschriebene Zeile Jar Jar.

Eine weitere Konsequenz ist, dass _ in anderen Parametererweiterungen verwendet werden kann, z. B. in der Befehlsfolge

printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles 

druckt isomorphism isosceles. Es gibt jedoch keine analoge ${!$%morphism} „-Erweiterung.

Weitere Informationen zu den Erweiterungsphasen in Bash finden Sie unter EXPANSION Abschnitt von man 1 bash (dies wird in der Online-Ausgabe als Shell-Erweiterungen bezeichnet). Die HISTORY EXPANSION Abschnitt ist separat.

Kommentare

  • Schön. Gut zu wissen. Auch gut dort ' s Stack Exchange. ' Es ist schwierig, Google nach etwas wie !$
  • zu durchsuchen

  • Übrigens können Sie in der Befehlszeile das letzte Argument des vorherigen Befehls mit insert-last-argument einfügen, normalerweise gebunden an M-..
  • @Andrew Bitte denken Sie daran, dies zu akzeptieren, wenn es Ihre Frage beantwortet. Das Akzeptieren und Upvoting anstelle von Kommentaren ist der Ausdruck des Dankes im SE-Netzwerk, siehe hier für die " offizielle " Haltung.
  • @ Andrew FYI, ich habe Google nach " bash bang dollar " und erzielte anständige Ergebnisse, einschließlich dieses Links als dritte Auflistung.
  • @terdon Ich habe letzte Nacht versucht, die Antwort zu akzeptieren, aber es war so schnell, dass ich es war gezwungen zu warten, um es zu akzeptieren.

Antwort

Genau genommen !$ ist das letzte Wort des letzten Befehls aus der Verlaufsliste.

Wort – Eine Folge von Zeichen, die von der Shell als Einheit behandelt werden. Wörter dürfen keine nicht zitierten Metazeichen enthalten.

Metazeichen – Ein Zeichen, das, wenn es nicht zitiert wird, Wörter trennt. Ein Metazeichen ist ein Leerzeichen oder eines der folgenden Zeichen: |, &, ;, (, ), < oder >

leer – Ein Leerzeichen oder Tabulatorzeichen.

Beispiele:

set -o history # enable command history set -o histexpand # enable ! style history substitution HISTSIZE=10 # save all lines on the history list HISTCONTROL= HISTIGNORE= date echo !$ # prints date date>/dev/null echo !$ # prints /dev/null echo a b c>/dev/null echo !$ # prints /dev/null HISTCONTROL=ignorespace # lines which begin with a space character are not saved in the history list echo a b c echo d e f # space at the beginning echo !$ # prints c 

Kommentare

Antwort

!$ gibt Ihnen den zuletzt verwendeten Befehl für diesen bestimmten Benutzer ….

Sie können den Verlauf der zuvor verwendeten Befehle auch mit dem Befehl history ermitteln … probieren Sie es aus ….

HINWEIS: Für einen bestimmten Benutzer werden alle zuvor verwendeten Befehle in der Bash-Verlaufsdatei gespeichert.

Kommentare

  • Die anderen Antworten sind richtig. Dieser ist falsch.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.