Me doy cuenta de que !
tiene un significado especial en la línea de comandos en el contexto del historial de la línea de comandos, pero aparte de eso, en un script de ejecución, el signo de exclamación a veces puede causar un error de análisis.
Creo que tiene algo que ver con un event
, pero no tengo idea de qué es un evento o qué hace. Aun así, el mismo comando puede comportarse de manera diferente en diferentes situaciones.
El último ejemplo, a continuación, causa un error; pero ¿por qué, cuando el mismo código funcionó fuera de la sustitución del comando? .. utilizando 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
hubiera sido más apropiado. (protegido por 'comillas simples')
var=$(…)
(sin comillas dobles), y funcionará como (creo) que espera. Esto sigue siendo “seguro” porque la parte del valor de una asignación simple no está sujeta a la división de palabras o comodines (aunque esto puede no ser cierto de las asignaciones hechas a través de órdenes internas (por ejemplo export
, local
, etc.) en todas las conchas). Desafortunadamente, esto no se extiende más allá de las tareas simples, ya que las comillas dobles son la forma de protegerse contra la división y el bloqueo de palabras mientras se obtienen otros tipos de expansión en otros contextos.