Co to znaczy! $?

Śledzę samouczek i wspomina o uruchomieniu tego polecenia:

sudo chmod 700 !$ 

Nie znam !$. Co to znaczy?

Komentarze

  • Generalnie ' można bezpiecznie spróbować echo coś, jeśli ' nie jesteś pewien, co to ' zrobisz.
  • @Shadur, nie zawsze. echo $(rm -rf /)
  • @cjm Jeśli nie ' korzystasz z naprawdę starego systemu, ' Będziemy potrzebować opcji --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.
  • @WChargin Bądź bardzo ostrożny zakładając, że " naprawdę stary " i " nie Linux / nie używające GNU coreutils " to to samo; nie są ' t.

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 Enter echo !$ Jar Enter W górę Enter ; i

  • echo Foo Enter echo $_ 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 do M-..
  • @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.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *