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
protected
teria 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.