Proszę spojrzeć na te polecenia:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Pierwsze dwa polecenia generują dymek powiadomienia zgodnie z oczekiwaniami. Trzeci podaje pokazany błąd.
i
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Tutaj również echo
działa dla pierwszych dwóch poleceń, ale nie dla trzeciego.
Więcej problemów tutaj (chociaż nie planowałem tego użyć): zarówno notify-send "SYNC!TIME"
i echo "SYNC!TIME"
daj bash: !TIME": event not found
.
Ale oba notify-send
i echo
pracuj z"SYNC! TIME"
Czy ktoś może wyjaśnić, dlaczego bash: !": event not found
pojawia się błąd?
.bashrc
liniiset +H
. Zauważ, że nie!
jest już wyjątkowy w skryptowaniu; traktowanie go jako specjalnego złamałoby wiele skryptów zgodnych ze standardami. Jest on traktowany jako „specjalny” w interaktywnych powłokach i tylko domyślnie, dopóki go nie naprawisz. :-)Ponieważ w bash
!
jest słowem zastrzeżonym (OK, znak), ma specjalne znaczenie w różnych kontekstach. W tym konkretnym przypadku nie ma znaczenia, jakie ma znaczenie w wyszukiwaniu historii. Odman bash
:Zasadniczo oznacza to, że bash weźmie znaki po
!
i przeszuka Twoją historię w poszukiwaniu pierwszego znalezionego polecenia, które zaczyna się od tych znaków. Łatwiej jest zademonstrować niż wyjaśnić:!
Aktywowane rozszerzenie historii, co zgadzało się z pierwszego polecenia wychodząc ze
której uprzednio prowadzonyecho foo
który następnie uruchomić ponownie. Więc kiedy pisałeś"SYNC TIME!"
, bash zobaczył!"
, przeszukał historię polecenia zaczynającego się od"
, zawiódł i narzekał na to. Ten sam błąd można uzyskać na przykład przez uruchomienie!nocommandstartswiththis
.Aby wydrukować wykrzyknik, musisz uciec przed nim na jeden z dwóch sposobów:
źródło
echo Hello world!
działa --- ekspansja historii nie jest wywoływana przez spacje ;-) (ah, fajne!
jest słowem zastrzeżonym wbash
, jak deklaruje również POSIX . Ale jestem prawie pewien, że jego status jako jednego jest całkowicie niezwiązany z jego rolą w ekspansji historii i nie ma znaczenia dla jego traktowania w podwójnych cytatach.!
jest słowem zastrzeżonym, ponieważ neguje status wyjścia polecenia / potoku, więc nie można go użyć jako polecenia. Żadne inne słowo zarezerwowane jest wyjątkowy w"
-quoted kontekście, choć$
to nie słowem zarezerwowanym ale jest traktowany specjalnie.