Estoy tratando de usar el comando curl para acceder a una url http con un signo de exclamación ( !
) en su ruta. p.ej:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
la consola responde con bash: ... event not found
.
¿Que esta pasando aqui? ¿Y cuál sería la sintaxis adecuada para escapar del signo de exclamación?
bash
quoting
special-characters
netbrain
fuente
fuente
Respuestas:
El signo de exclamación es parte de la expansión de la historia en bash. Para usarlo, debe estar entre comillas simples (por ejemplo:)
'http://example.org/!132'
o para escapar directamente con una barra diagonal inversa (\
) antes del carácter (por ejemplo:)"http://example.org/\!132"
.Tenga en cuenta que entre comillas dobles, una barra invertida antes de la exclamación impide la expansión del historial, PERO la barra invertida no se elimina en tal caso. Por lo tanto, es mejor usar comillas simples, por lo que no está pasando una barra diagonal inversa
curl
como parte de la URL.fuente
"http://example.org/\!132"
en realidad se expande sin interpretar la barra diagonal inversa (razones de cumplimiento POSIX, creo).\!
y comillas dobles.|
y se utiliza para crear una tubería. Si envía scripts a los clientes y no puede estar seguro de en qué shell lo ejecutarán, ¡debe probar con todos ellos!Además de la respuesta dada por Daniel, también puede desactivar la expansión del historial por completo si no la usa
set +H
.fuente
Ctrl-R
) que te permiten previsualizar y editar tu comando para que no dispares a ciegas con el comando!-14
que creías que estaba en!-12
ese momentorm -rf *
. Cuidate. ¡Deshabilita la expansión del historial! ¡Evita el!
!fc -14
lugar. Pero es cierto que puede hacerlo sin que también se habilite la expansión del historial. Personalmente, utilizo!$
y!vi
esudo !!
incluso con lagit add !vi:$
frecuencia suficiente para garantizar que se habilite la expansión del historial.Yo personalmente haría comillas simples, pero para completar, también notaré que, como es una URL, puede codificar
!
como%21
, por ejemplocurl -v http://example.org/%21132
.fuente
Esto también puede hacer
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
o
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
Lo que funciona porque bash concatena cadenas adyacentes. Este enfoque es particularmente útil cuando tiene otras cosas que necesitan expansión de shell, por lo que no puede usar comillas simples para toda la cadena:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
El carácter se utiliza para expansiones del historial en la línea de comandos.así que esto puede ser un problema en la solicitud pero no en los archivos de script de shell.
como puede ver, las expansiones históricas funcionan incluso entre comillas dobles.
fuente
Me he encontrado con el mismo problema, y mi solución simple fue usar una variable:
Aquí la simplicidad es que (1) es portátil a través de shells y comandos (2) No requiere conocer la sintaxis de escape y los códigos ASCII.
fuente
Desde Bash 4.3, ahora puede usar comillas dobles para citar el carácter de expansión del historial:
fuente
echo
, echo parece manejar esto de manera diferente por sí mismobash
versión no tiene nada que ver con que la explosión no se expanda, se debe al hecho de que, en su ejemplo,!
le sigue "final de línea" y eso evita que el shell intente expandirlo. Intenteecho "!Hello World"
y verá quebash
responderá conbash: !Hello: event not found
. Consulte el manual para obtener más detallesPara aquellos que usan git bash en windows, la respuesta aceptada de @DanielPittman funciona. Sin embargo, debe reemplazar la barra diagonal inversa (\) con una barra diagonal (/).
Por ejemplo, en Unix, se vería así:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Para Windows, sería algo como esto (concéntrese en la barra diagonal en la parte del encabezado de autorización)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
fuente