Estou tentando usar o comando curl para acessar um URL http com um ponto de exclamação ( !
) no caminho. por exemplo:
curl -v "http://example.org/!287s87asdjh2/somepath/someresource"
o console responde com bash: ... event not found
.
O que está acontecendo aqui? e qual seria a sintaxe apropriada para escapar do ponto de exclamação?
bash
quoting
special-characters
netbrain
fonte
fonte
Respostas:
O ponto de exclamação faz parte da expansão do histórico no bash. Para usá-lo, você precisa dele entre aspas simples (por exemplo
'http://example.org/!132'
:) ou para escapar diretamente com uma barra invertida (\
) antes do caractere (por exemplo"http://example.org/\!132"
:).Observe que, entre aspas duplas, uma barra invertida antes do exclam impede a expansão do histórico, MAS a barra invertida não é removida nesse caso. Portanto, é melhor usar aspas simples, para que você não passe uma barra invertida literal
curl
como parte do URL.fonte
"http://example.org/\!132"
na verdade se expande sem interpretar a barra invertida (razões de conformidade com POSIX, acredito).\!
e com aspas duplas.|
e é usado para criar um canal. Se você estiver enviando scripts para os clientes e não tiver certeza de qual shell eles serão executados, será necessário testar com todos eles!Assim como a resposta dada por Daniel, você também pode simplesmente desativar completamente a expansão do histórico se não a usar
set +H
.fonte
Ctrl-R
) que permitem visualizar e editar seu comando para que você não atire cegamente com o comando!-14
que você achava que era!-12
, oparm -rf *
. Ser seguro. Desative a expansão do histórico! Evite o!
!fc -14
no POSIX . Mas é verdade que você pode fazer isso sem a expansão do histórico estar ativada também. Pessoalmente, eu uso!$
e!vi
esudo !!
e até mesmogit add !vi:$
muitas vezes o suficiente para justificar deixando expansão história habilitado.Eu pessoalmente faria aspas simples, mas, para completar, também observarei, como é uma URL, você pode codificar
!
como%21
, por exemplocurl -v http://example.org/%21132
.fonte
Isso também pode fazer
curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
ou
curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"
O que funciona porque o bash concatena as seqüências adjacentes. Essa abordagem é particularmente útil quando você tem outras coisas que precisam de expansão do shell; portanto, não é possível usar aspas simples para toda a cadeia:
curl -v 'http://example.org/!'"287s87asdjh2/${basepath}/someresource"
!
O caractere é usado para expansões do histórico no prompt da linha de comando.portanto, isso pode ser um problema no prompt, mas não nos arquivos de script do shell.
como você pode ver as expansões do histórico funcionam mesmo entre aspas duplas.
fonte
Eu me deparei com o mesmo problema e minha solução simples era usar uma variável:
Aqui a simplicidade é que (1) é portátil através de shells e comandos (2) Não requer conhecimento de sintaxe de escape e códigos ASCII.
fonte
Desde o Bash 4.3, agora você pode usar aspas duplas para citar o caractere de expansão do histórico:
fonte
echo
, eco parece lidar com isso de forma diferente por conta própriabash
versão não tem nada a ver com o estrondo não ser expandido, é devido ao fato de que, no seu exemplo,!
é seguido por "fim de linha" e isso impede que o shell tente expandi-lo. Tenteecho "!Hello World"
e você verá quebash
responderá combash: !Hello: event not found
. Veja o manual para mais detalhesPara quem está usando o git bash no Windows, a resposta aceita de @DanielPittman funciona. No entanto, você deve substituir a barra invertida (\) por uma barra (/).
Por exemplo, no unix, seria algo parecido com isto:
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS\!ZR412543s'
Para o Windows, seria algo assim (concentre-se na barra na parte do cabeçalho da autorização)
curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'
fonte