Bash używa wykrzykników do rozszerzeń historii, jak wyjaśniono w odpowiedziach na to pytanie (np. sudo !!
Uruchamia poprzedni wiersz poleceń sudo
). Jednak nie mogę znaleźć nigdzie, co wyjaśnia, co robi następujące polecenie (np. Pojedynczy wykrzyknik):
!
Wygląda na to, że nic nie drukuje i wychodzi z 1, ale nie jestem pewien, dlaczego to robi. Szukałem online i na stronie podręcznika użytkownika Bash, ale nie mogę nic znaleźć, poza tym, że jest to „słowo zastrzeżone” - ale tak jest }
i uruchamiam to:
}
wypisuje błąd:
bash: syntax error near unexpected token `}'
!
wskazuje „początek” wyrażenia rozszerzenia historii.Odpowiedzi:
Samotny
!
na początku polecenia neguje status wyjścia polecenia lub potoku : jeśli polecenie wyjdzie0
, przejdzie w1
(niepowodzenie), a jeśli wyjdzie niezerowe, zamieni je w0
(pomyślne) wyjście.Użycie to jest udokumentowane w podręczniku Bash:
!
Bez następującego polecenia neguje pusty komendę, która nic nie robi i zwraca true (równoważne z:
poleceniem ). W ten sposób odwraca prawdę na fałsz i wychodzi ze statusem 1, ale nie powoduje błędu.Istnieją także inne zastosowania
!
wewnątrztest
i[[
poleceń, gdzie one zniweczyć próbę warunkowego. Nie są one związane z tym, co widzisz. Zarówno w twoim pytaniu, jak i w tych przypadkach, nie jest to związane z rozszerzaniem historii i!
jest oddzielone od innych terminów.źródło
Pojedynczy wykrzyknik można znaleźć w podręczniku bash w sekcji 3.2.2 Rurociągi
Także sekcja 3.2.4.2 Konstrukcje warunkowe
Także sekcja 4.1 Wbudowane powłoki Bourne'a
Należy również zauważyć, że
!
rozpocznie podstawianie historii, chyba że następuje po niej: spacja, tabulator, koniec linii, „=” lub „(” (gdy opcja powłoki extglob jest włączona przy użyciu wbudowanego shopt).źródło
Ponieważ
!
jest używany w porównaniach i oznacza NIE .Na przykład:
źródło
!
argumentutest
polecenia (w tym wbudowanej wersji bash), a nie znaczenie,!
gdy jest używany w pozycji polecenia.! [...]
dopasowanie pytania.[]
taktest
. Trochę się spieszę.!
wbudowane polecenie, odwraca sens potoku.Inne zastosowania:
#!
wbudowane polecenie, wywołuje nazwanego interpretera w celu wykonania skryptu.!
oznacznik zdarzenia oznacza słowo wiersza polecenia jako podstawienie historii!=
operator nierówności$!
zmienna powłoki, zwraca numer procesu ostatniego polecenia w tle.źródło
ls -l /tmp
cd !$
Spowoduje to przejście do katalogu / tmp.! następnie ciąg znaków wykonuje ostatnie poprzednie polecenie (wciąż w buforze poleceń), które rozpoczęło się od podanego ciągu. Być może powłoka właśnie odkryła, że żadne poprzednie polecenie nie zaczynało się od <null>.
źródło