Mi rendo conto che !
ha un significato speciale sulla riga di comando nel contesto della cronologia della riga di comando, ma a parte questo, in uno script corrente il punto esclamativo può talvolta causare un errore di analisi.
Penso che abbia qualcosa a che fare con un event
, ma non ho idea di cosa sia un evento o cosa faccia. Anche così, lo stesso comando può comportarsi diversamente in situazioni diverse.
L'ultimo esempio, di seguito, causa un errore; ma perché, quando lo stesso codice ha funzionato al di fuori della sostituzione del comando? .. usando 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
sarebbe stato più appropriato. (protetto da "virgolette singole")
var=$(…)
(senza virgolette doppie) e funzionerà come (penso) ti aspetti. Questo è ancora “sicuro”, perché la parte di valore di un incarico semplice, non è soggetta alla suddivisione in parole o globbing (anche se questo potrebbe non essere vero per le assegnazioni fatte attraverso builtins (ad esempio export
, local
e così via) in tutte le conchiglie). Sfortunatamente, questo non si estende oltre i semplici compiti poiché le doppie virgolette sono il modo di proteggere dalla divisione delle parole e dai globbing pur ottenendo altri tipi di espansione in altri contesti.