Śledzę samouczek i wspomina o uruchomieniu tego polecenia:
sudo chmod 700 !$
Nie znam !$
. Co to znaczy?
Komentarze
Odpowiedz
Zasadniczo „to ostatni argument poprzedniego polecenia.
!$
to„ koniec ”poprzedniego polecenia . Rozważmy następujący przykład: Zaczynamy od wyszukania słowa w pliku:grep -i joe /some/long/directory/structure/user-lists/list-15
jeśli joe jest na tej liście użytkowników, chcemy go z niej usunąć . Możemy albo uruchomić vi z tym długim drzewem katalogów jako argumentem, albo po prostu jako
vi !$
Który bash rozwija się do:vi /some/long/directory/structure/user-lists/list-15
( źródło ; poręczny przewodnik)
Różnica między tym !$
tokenem a specjalną zmienną powłoki $_
nie jest nic warta . Rzeczywiście, oba rozwijają do ostatniego argumentu poprzedniego polecenia. Jednak !$
jest rozwijane podczas rozwijania historii , podczas gdy $_
jest rozwijane podczas rozwijania parametrów . Jedną z ważnych konsekwencji tego jest to, że gdy używasz !$
, polecenie rozwinięte jest zapisywane w historii.
Na przykład weź pod uwagę naciśnięcia klawiszy
-
echo Foo
Enterecho !$ Jar
Enter W górę Enter ; i -
echo Foo
Enterecho $_ Jar
Wpisz Góra Enter.
(Jedyne zmienione znaki to $!
i $_
w środku.)
W pierwszym przypadku naciśnięcie klawisza W górę czyta echo Foo Jar
, więc ostatnia linia zapisana na stdout to Foo Jar
.
W tym drugim przypadku, gdy naciśniesz Do góry , wiersz poleceń brzmi echo $_ bar
, ale teraz $_
ma inną wartość niż poprzednio – w rzeczywistości $_
to teraz Jar
, więc ostatnia linia zapisana na stdout to Jar Jar
.
Inną konsekwencją jest to, że _
może być używane w innych rozszerzeniach parametrów, na przykład w sekwencji poleceń
printf "%s " isomorphism printf "%s\n" ${_%morphism}sceles
drukuje isomorphism isosceles
. Ale nie ma „analogicznego” ${!$%morphism}
„rozwinięcia.
Aby uzyskać więcej informacji na temat faz rozwinięcia w Bash, zobacz EXPANSION
sekcja man 1 bash
(w wydaniu internetowym nazywa się ona Rozszerzenia powłoki ). HISTORY EXPANSION
jest oddzielna.
Komentarze
- Fajnie. Dobrze wiedzieć. Dobrze też, że ' s Stack Exchange. ' trudno jest wyszukać w Google coś takiego jak
!$
- Przy okazji, w wierszu poleceń można wstawić ostatni argument poprzedniego polecenia za pomocą
insert-last-argument
, zwykle przypisanego doM-.
. - @Andrew, pamiętaj, aby zaakceptować to, jeśli odpowiedź na Twoje pytanie. Akceptowanie i głosowanie za, zamiast publikowania komentarzy, to sposób wyrażania podziękowań w sieci SE, patrz tutaj dla " oficjalne " stanowisko.
- @Andrew FYI, szukałem w Google " bash bang dollar " i uzyskałem przyzwoite wyniki, w tym ten link jako trzecia lista.
- @terdon Próbowałem zaakceptować odpowiedź zeszłej nocy, ale była tak szybka, że zmuszony czekać na akceptację.
Odpowiedź
Ściśle mówiąc !$
to ostatnie słowo ostatniego polecenia z listy historii.
słowo – sekwencja znaków traktowana przez powłokę jako jednostka. Słowa nie mogą zawierać niecytowanych metaznaków.
metaznak – znak, który, gdy nie jest cytowany, oddziela słowa. Metaznak to spacja lub jeden z następujących znaków: |, &, ;, (, ), < lub >
puste – spacja lub znak tabulacji.
Przykłady:
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
Komentarze
Odpowiedź
!$
poda ostatnio użyte polecenie dla tego konkretnego użytkownika ….
możesz również znaleźć historię poleceń użytych wcześniej, używając polecenia history
… wypróbuj ….
UWAGA: W przypadku konkretnego użytkownika wszystkie polecenia używane wcześniej będą przechowywane w pliku historii basha.
Komentarze
- Pozostałe odpowiedzi są prawidłowe. Ten jest zły.
echo
coś, jeśli ' nie jesteś pewien, co to ' zrobisz.echo $(rm -rf /)
--no-preserve-root
w tym miejscu, a jeśli widzisz słowa " no preserve " w programie lepiej dokładnie zastanów się nad tym, co on robi.