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 Sieecho !$ Jar
Enter Up Enter ; und -
echo Foo
Geben Sieecho $_ 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 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
!$
- Übrigens können Sie in der Befehlszeile das letzte Argument des vorherigen Befehls mit
insert-last-argument
einfügen, normalerweise gebunden anM-.
. - @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.
zu durchsuchen
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.