Intente ejecutar lo siguiente bajo un shell bash echo "Reboot your instance!"
En mi instalación:
root@domU-12-31-39-04-11-83:/usr/local/bin# bash --version
GNU bash, version 4.1.5(1)-release (i686-pc-linux-gnu)
Copyright (C) 2009 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
root@domU-12-31-39-04-11-83:/usr/local/bin# uname -a
Linux domU-12-31-39-04-11-83 2.6.35-22-virtual #35-Ubuntu SMP Sat Oct 16 23:57:40 UTC 2010 i686 GNU/Linux
root@domU-12-31-39-04-11-83:/usr/local/bin# echo "Reboot your instance!"
-bash: !": event not found
¿Alguien puede explicar qué es "bash events"? Nunca he escuchado este concepto antes. Además, ¿cómo debo mostrar "!" al final de la oración?
+H
para habilitar algo y-H
para deshabilitar algo.+
es simplemente lo contrario de eso.!
es un personaje especial para bash, se usa para referirse a comandos anteriores; p.ej,recordará y ejecutará el último comando que comenzó con la cadena "rm", y
recordará pero no ejecutará el último comando que comenzó con la cadena "rm". bash está interpretando el signo de exclamación
echo "reboot your instance!"
como " sustituir 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 comenzó con un solo doble comillaTratar
para proteger (escapar) el signo de exclamación de bash.
fuente
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 toda la cadena, sin cambios.
!
se usa en los comandos para referirse 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 expandirse!"
como referencia a un evento antes de que echo eche un vistazo, de ahí el error.Tenga en cuenta que en los scripts, todos los comandos del historial están deshabilitados, ya que solo tienen sentido en un shell interactivo.
El único que uso regularmente es
!$
. Se expande al último argumento del comando anterior. Es una taquigrafía útil en algunos lugares.fuente
!!
completar el último comando ingresado es notablemente útil; particularmente,sudo !!
opfexec !!
$_
funciona en más shells que bash y es una variable adecuada, a diferencia de!$
. (y @LeartS: Me gustó la falta de emoticones de tu broma.;))¡Solo pon un espacio entre ellos! y "de lo que funcionará.
Salud.
fuente
Si, ! es un carácter especial para bash, se usa para referirse a comandos anteriores.
Pocas maneras de manejar la situación.
Lo siguiente generará la cadena tal como está
Lo siguiente ejecutará el comando y concatenará la cadena
fuente
En
bash 4.3
lo que parece que ya no es necesario usar comillas simples oset +H
:fuente
set +H
o cito. O tienes unset +H
lugar (como en/etc/profile
).También podría usar un heredoc :
Es molesto en este caso porque no es de una sola línea, pero para comandos más largos (como escribir un script bash), funciona muy bien.
fuente