Pregunta En bash, ¿cómo escapo un signo de exclamación?


Quiero hacer algo como bzr commit -m "It works!". Puedo escapar de la exclamación haciendo bzr commit -m "It works\!". Sin embargo, mi mensaje de confirmación incluye la barra diagonal inversa. ¿Cómo escapo del signo de exclamación, mientras sigo ignorando la barra invertida?


163


origen


Obra bzr commit -m "It works"! funciona, también - kba
Como noté antes, el comando que pones realmente funciona por sí mismo :) bzr commit -m "It works!" - h4unt3r
Un caso aún más peculiar con comillas anidadas: stackoverflow.com/questions/22125658/... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Aunque la respuesta aceptada es una buena solución para sus problemas de compromiso, creo que no es una respuesta al problema real: Expansión de la historia de Bash. Por favor, considere aceptar la respuesta de Dennis? - Arjan


Respuestas:


Como no depende de bash para expandir las variables en su mensaje de confirmación, podría usar comillas simples. Las cadenas en comillas simples no se expanden por bash.

bzr commit -m 'This does work!' 

134



Ya que la pregunta era "¿Cómo escapo un signo de exclamación?" y no "¿Cómo no expandir un signo de exclamación?" No creo que esto sea válido. Algunas veces (como cuando pasa apóstrofos y signos de exclamación en la misma línea de comandos) esto no funciona. La respuesta a continuación funciona mucho mejor para hacer lo que mucha gente necesita. - Jann
@Jann: Estás 100% en lo cierto al respecto, pero creo que el problema es el que tiene tantas preguntas sobre el superusuario: respondemos la pregunta al punto o ayudamos a las personas a resolver su problema específico. Creo que ambas formas pueden ser útiles, y esto fue en busca de ayuda sobre un tema específico. - Benjamin Bannier
touché! Este fue un problema específico. Simplemente tiendo a querer una respuesta a mis preguntas para poder utilizarla en muchas situaciones. pS: La razón por la que incluso mencioné esto fue porque necesitaba pasar un apóstrofo y un signo de exclamación a un programa perl y necesitaba la siguiente solución. :) - Jann
Estoy de acuerdo con ambos, Benjamin y Jann, pero di un voto negativo. El título de la pregunta está indexado por los motores de búsqueda y así es como vine aquí y probablemente la mayoría de los usuarios vengan aquí. Es por eso que creo que es importante que la pregunta real refleje el problema subyacente. En otros foros se aconseja a las personas (casi forzadas) que pregunten exactamente qué buscan. Responder preguntas mal expresadas apoya el descuido y esa es la razón exacta de mi downvote aquí. Como solución de compromiso / solución, mi sugerencia es ayudar a adaptar el encabezado para que refleje el problema real. - ChristophK


Una vieja pregunta que sé, pero para futuros buscadores:

También puede utilizar este método si desea comillas dobles y la exclamación:

echo "It's broken"'!'

Esto funciona incluso si el ! no está al final de la línea.

Por ejemplo:

echo "hello there"'!'" and goodbye"

Bonificación: se puede usar una técnica similar para escapar alguna texto en Sh o Bash (con la ayuda de sed): vea la primera opción en esta respuesta. Además, si tienes bash-completion instalado, es probable que tenga el quote() función disponible ya


139



Buen consejo, JWD. No me di cuenta de que las cadenas de bash podían concatenarse simplemente omitiendo espacios en blanco entre ellas. - Alan H.
En realidad, si el signo de exclamación está al final de la cadena, estás en el claro echo "Happy birthday!" funcionará como se espera, de lo contrario puede escapar con una barra diagonal inversa, pero la barra diagonal inversa se imprimirá también XD Bash no es para los débiles de corazón :) - h4unt3r
@ h4unt3r: Extraño, esa no es mi experiencia. Para mi, echo "Happy Birthday!" salidas 2 líneas. El primero es echo "Happy birthday" (sin exclamación), y el segundo es "Feliz cumpleaños" (nuevamente, sin exclamación). ¿Tiene activada la expansión de historial cuando realiza esta prueba? - jwd
@jwd ¿qué versión de bash estás ejecutando? Siempre tengo expansión hist. ¿Usaste accidentalmente dos? para tu prueba? - h4unt3r
@ h4unt3r: version 4.1.2(1)-release (x86_64-redhat-linux-gnu), definitivamente solo uno ! siendo utilizado. yo tengo histexpand presentar en $SHELLOPTS. Sin embargo, simplemente intenté 4.3.18 (2) liberar en otra máquina, y se comporta como lo describió. Supongo que fue un error que se solucionó. - jwd


Apagar expansión de la historia:

set +H

o

set +o histexpand

63



Gracias - esto funcionó, pero tuve que hacer set +o histexpandno set -o histexpand. ¿Podrías editar tu respuesta para arreglar esto? - Matthew
Vaya, error tipográfico, lo siento. Fijo. - Dennis Williamson
excelente! estaba buscando esto para las EDAD ... ¡thx vm! como escape no funcionará ... No quiero usar comillas simples también ... Añadiré esto a mi .bashrc thx !!, nunca usado ! en scripts y por nada !! siempre fue preocupante ... - Aquarius Power
¡Esto es tan asombroso! echo "@AquariusPower!" - joehanna


Use comillas simples (') en lugar de comillas dobles ("). Las comillas simples desactivan toda la interpretación de las cosas en ellas, mientras que las comillas dobles solo desactivan algunas.

bzr commit -m 'It works!'

9





Acabo de encontrar otra manera, que al menos funcionará con echoing strings (oraciones) que desea puntuar con un signo de exclamación. Hace un recorrido final, más o menos, alrededor de Bash histexpand y tarda solo un poco más en codificar.

El hex para un signo de exclamación, como se enumera en http://www.ascii-code.com/, tiene 21 años, así que si pones \x21 al final de tu cadena, echo -e $foo, hacer $foo su propio eco expandido [es decir, foo=$(echo -e "$foo")], lo que obtienes cuando echo $foo de nuevo es la cadena con un ! al final. Y tampoco cambiar de histexpand.

Funciona con seguridad en Bash 4+. Versiones anteriores, ymmv.


4



Hmmm no funciona para mí. - lzap