Solución 1:
!
es un carácter especial para bash, se usa para referirse a comandos anteriores; por ejemplo,
!rm
recuperará y ejecutará el último comando que comenzó con la cadena "rm", y
!rm:p
recordará pero no ejecutará el último comando que comenzó con la cadena "rm". bash está interpretando el signo de exclamación en echo "reboot your instance!"
como "sustituya aquí el último comando que comenzó con los caracteres que siguen inmediatamente al signo de exclamación ", y se queja de que no puede encontrar un evento (comando) en su historial que comience con una sola comilla doble.
Prueba
echo reboot your instance\!
para proteger (escapar) el signo de exclamación de bash.
Solución 2:
Puedes desactivar la sustitución del historial usando set +H
.
Solución 3:
Para resolver su problema original, intente usar comillas simples, en lugar de comillas dobles. Con este último, bash intentará expandir ciertos caracteres antes de pasar el resultado al comando (echo en este caso). Con comillas simples, bash pasa la cadena completa, sin cambios.
!
se utiliza en los comandos para hacer referencia al historial de la línea de comandos. Consulte:http://tldp.org/LDP/abs/html/abs-guide.html#HISTCOMMANDS para obtener un conjunto completo. Con el ejemplo anterior, bash intenta expandir !"
como referencia a un evento antes de que echo eche un vistazo, de ahí el error.
Tenga en cuenta que en los scripts, todos de los comandos de historial están deshabilitados, ya que solo tienen sentido en un shell interactivo.
El único que uso regularmente es !$
. Se expande hasta el último argumento del comando anterior. Es una abreviatura útil en algunos lugares.
Solución 4:
Solo pon un espacio entre !
y "
de lo que funcionará.
Solución 5:
Sí, ! es un carácter especial para bash, se usa para referirse a comandos anteriores.
Algunas de las formas en que puedes manejar la situación
Lo siguiente generará la cadena tal como es
echo 'Reboot your instance!'
Lo siguiente ejecutará el comando y concatenará la cadena
echo 'escaping #'" adding `which python` to the string"
echo '#!'`which python`