Quiero hacer algo así bzr commit -m "It works!"
. Puedo escapar del signo de exclamación haciendo algo bzr commit -m "It works\!"
. Sin embargo, mi mensaje de confirmación incluye la barra diagonal inversa. ¿Cómo escapo el signo de exclamación, mientras sigo ignorando la barra invertida?
bash
syntax
escape-characters
Mateo
fuente
fuente
bzr commit -m "It works"!
trabajos también.bzr commit -m "It works!"
Respuestas:
Como no depende de bash para expandir las variables en su mensaje de confirmación, puede usar comillas simples en su lugar. Las cadenas entre comillas simples no se expanden con bash.
fuente
Aquí hay otro método si desea comillas dobles y la exclamación:
Esto funciona incluso si
!
no está al final de la línea.Por ejemplo:
Bonificación: se puede usar una técnica similar para escapar de cualquier texto en Sh o Bash (con la ayuda de sed): vea la primera opción en esta respuesta . Además, si ha
bash-completion
instalado, es probable que ya tenga laquote()
función disponible.fuente
echo "Happy birthday!"
, funcionará como se esperaba, de lo contrario, puede escapar con una barra invertida, pero la barra invertida también se imprimirá XD Bash no es para los débiles :)echo "Happy Birthday!"
salidas 2 líneas. El primero esecho "Happy birthday"
(sin exclamación), y el segundo es "Feliz cumpleaños" (nuevamente, sin exclamación). ¿Tiene activada la expansión del historial cuando realiza esta prueba?version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
definitivamente solo se!
está utilizando uno . Tengohistexpand
presente en$SHELLOPTS
. Sin embargo, acabo de probar la versión 4.3.18 (2) en otra máquina, y se comporta como lo describiste. Supongo que fue un error que se solucionó.Desactiva la expansión del historial :
o
Puede agregar uno de esos comandos a su
~/.bashrc
si generalmente no usa la expansión del historial.Bash 4.3 agregó un caso especial :
fuente
set +o histexpand
, noset -o histexpand
. ¿Podrías editar tu respuesta para arreglar esto?.bashrc
thx !!, nunca usado!
en scripts y para nada !! siempre fue preocupante ...echo "@AquariusPower!"
Use comillas simples (') en lugar de comillas dobles ("). Las comillas simples desactivan toda interpretación de las cosas en ellas, mientras que las comillas dobles solo desactivan algunas.
fuente
Acabo de encontrar otra forma, que al menos funcionará con
echo
cadenas (oraciones) que desea puntuar con un signo de exclamación. Hace una ejecución final, más o menos, alrededor de Bash histexpand y toma solo un poco más de tiempo para codificar.El hexadecimal para un signo de exclamación, como se enumera en http://www.ascii-code.com/ , es 21, por lo que si coloca
\x21
al final de su cadenaecho -e $foo
, haga$foo
su propio eco expandido [es decir,foo=$(echo -e "$foo")
] lo que obtener cuando deecho $foo
nuevo es la cadena con un!
al final. Y tampoco cambiar de histexpand.Funciona seguro en Bash 4+. Versiones anteriores, ymmv.
fuente
printf "OMG\041"
. Si está creando una cadena entre comillas dobles en algún lugar que no sea echo o printf, como la cadena de confirmación sobre la que se le preguntó a OP, puede incrustar$(echo -e "\041")
en la cadena donde debería estar el signo de exclamación. De esta manera:bzr commit -m "This is a great commit$(echo -e "\041")"
.