Zdaję sobie sprawę, że !
ma to szczególne znaczenie w wierszu poleceń w kontekście historii wiersza poleceń, ale poza tym w wykrywającym skrypcie wykrzyknik może czasami powodować błąd analizy.
Myślę, że ma to coś wspólnego z event
, ale nie mam pojęcia, co to za wydarzenie lub co robi. Mimo to to samo polecenie może zachowywać się inaczej w różnych sytuacjach.
Ostatni przykład poniżej powoduje błąd; ale dlaczego, kiedy ten sam kod działał poza podstawieniem polecenia? .. używając GNU bash 4.1.5
# This works, with or without a space between ! and p
{ echo -e "foo\nbar" | sed -nre '/foo/! p'
echo -e "foo\nbar" | sed -nre '/foo/!p'; }
# bar
# bar
# This works, works when there is a space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/! p')"; echo "$var"
# bar
# This causes an ERROR, with NO space between ! and p
var="$(echo -e "foo\nbar" | sed -nre '/foo/!p')"; echo "$var"
# bash: !p': event not found
protected
Byłoby bardziej odpowiednie. (chronione przez „pojedyncze cudzysłowy”)
var=$(…)
(bez podwójnych cudzysłowów) i będzie działać tak, jak oczekuję. Jest jeszcze „bezpieczne”, ponieważ część wartość przypisania prostego nie podlega podziałowi na słowa lub globbing (choć może to nie być prawdą zadań wykonanych przez poleceń wbudowanych (np export
, local
itp) we wszystkich muszli). Niestety, nie wykracza to poza proste przypisania, ponieważ podwójne cudzysłowy są sposobem ochrony przed dzieleniem słów i dzieleniem tekstu, a jednocześnie zapewniają inne rodzaje ekspansji w innych kontekstach.