Sei que isso !tem um significado especial na linha de comando no contexto do histórico da linha de comando, mas fora isso, em um script em execução, o ponto de exclamação às vezes pode causar um erro de análise.
Eu acho que tem algo a ver com um event, mas não tenho idéia do que é um evento ou do que ele faz. Mesmo assim, o mesmo comando pode se comportar de maneira diferente em situações diferentes.
O último exemplo, abaixo, causa um erro; mas por que quando o mesmo código funcionou fora da substituição de 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
protectedteria sido mais apropriado. (protegido por 'aspas simples')
var=$(…)(sem aspas duplas) e funcionará como (eu acho) que você espera. Este é ainda “seguro” porque a parte do valor de uma atribuição simples não está sujeito à repartição de palavras ou englobamento (embora isso não pode ser verdade de atribuições feitas através builtins (por exemplo export, local, etc.) em todas as conchas). Infelizmente, isso não se estende para além de atribuições simples, pois as aspas duplas são a maneira de se proteger contra a divisão de palavras e globbing, enquanto ainda se obtém outros tipos de expansão em outros contextos.