Mire estos comandos:
$ notify-send SYNC TIME!
$ notify-send 'SYNC TIME!'
$ notify-send "SYNC TIME!"
bash: !": event not found
$
Los primeros dos comandos producen una burbuja de notificación como se esperaba. El tercero da el error que se muestra.
y
$ echo SYNC TIME!
SYNC TIME!
$ echo 'SYNC TIME!'
SYNC TIME!
$ echo "SYNC TIME!"
bash: !": event not found
$
Aquí también, echo
funciona para los dos primeros comandos pero no en el tercero.
Más problemas aquí (aunque no estaba planeando usar esto): ambos notify-send "SYNC!TIME"
y echo "SYNC!TIME"
dar bash: !TIME": event not found
.
Pero ambos notify-send
y echo
trabajar con"SYNC! TIME"
¿Alguien puede explicar por qué bash: !": event not found
aparece el error?
.bashrc
líneaset +H
. Tenga en cuenta que!
ya no es especial en secuencias de comandos; tratarlo como especial rompería muchos scripts que cumplen con los estándares. Solo se trata como "especial" en shells interactivos, y solo de forma predeterminada hasta que lo arregles. :-)Porque en bash,
!
es una palabra reservada (OK, carácter), tiene un significado especial en diferentes contextos. En este caso particular, estás cayendo en conflicto con su importancia en la búsqueda de la historia. Deman bash
:Básicamente, lo que esto significa es que bash tomará los caracteres después del
!
y buscará en su historial el primer comando que encuentre que comience con esos caracteres. Es más fácil demostrar que explicar:La
!
expansión del historial activado, que coincidía con el primer comando que comenzaba con ele
que se ejecutó anteriormente,echo foo
que luego se ejecutó nuevamente. Entonces, cuando escribiste"SYNC TIME!"
, bash vio el!"
, buscó en el historial un comando que comenzó"
, falló y se quejó. Puede obtener el mismo error ejecutando, por ejemplo!nocommandstartswiththis
.Para imprimir un signo de exclamación, debe escapar de una de estas dos formas:
fuente
echo Hello world!
funciona --- la expansión del historial no se desencadena por espacios en blanco ;-) (ah, los buenos casos de esquina ...)!
es una palabra reservada enbash
, como POSIX también declara . Pero estoy bastante seguro de que su estado como uno no está relacionado con su papel en la expansión de la historia y es irrelevante para su tratamiento entre comillas dobles.!
es una palabra reservada porque niega el estado de salida de un comando / canalización, por lo que no se puede usar como un comando. Ninguna otra palabra reservada es especial en un"
contexto entre comillas, mientras$
que no es una palabra reservada, pero se trata especialmente.