Não pode usar o ponto de exclamação (!) no bash?

60

Estou tentando usar o comando curl para acessar um URL http com um ponto de exclamação ( ! ) em seu 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 adequada para escapar do ponto de exclamação?

    
por netbrain 03.03.2012 / 19:36

7 respostas

68

O ponto de exclamação faz parte da expansão do histórico no bash. Para usá-lo, você precisa incluir entre aspas simples (por exemplo: 'http://example.org/!132' ) ou diretamente com uma barra invertida ( \ ) antes do caractere (por exemplo: "http://example.org/\!132" ).

Observe que nas aspas duplas, uma barra invertida antes do exclam impede a expansão do histórico, MAS a barra invertida não é removida nesse caso. Por isso, é melhor usar aspas simples, portanto, você não está passando uma barra invertida literal para curl como parte da URL.

    
por 03.03.2012 / 19:38
48

Além da resposta dada por Daniel, você também pode simplesmente desativar a expansão do histórico se não a usar com set +H .

    
por 03.03.2012 / 20:15
16

Eu, pessoalmente, faço citações simples, mas, para fins de conclusão, também observarei que, como é um URL, você pode codificar o ! as %21 , por exemplo, curl -v http://example.org/%21132 .

    
por 04.03.2012 / 00:17
10

Isso também pode fazer

curl -v "http://example.org/"'!'"287s87asdjh2/somepath/someresource"
ou curl -v "http://example.org/"\!"287s87asdjh2/somepath/someresource"

O caractere ! é usado para expansões de histórico no prompt de linha de comando.
Portanto, isso pode ser um problema no prompt, mas não em arquivos de script de shell.
como você pode ver, as expansões de histórico funcionam mesmo entre aspas duplas.

    
por 15.06.2015 / 08:43
5

Eu me deparei com o mesmo problema, e minha solução simples foi usar uma variável:

E=!  
curl -v "http://example.org/${E}287s87asdjh2/somepath/someresource"

Aqui, a simplicidade é que (1) É portátil entre shells e comandos (2) Não requer conhecimento de sintaxe de escape e códigos ASCII.

    
por 25.05.2015 / 09:06
2

Desde o Bash 4.3, agora você pode usar aspas duplas para citar o caractere de expansão do histórico:

$ bash --version
GNU bash, version 4.3...
[...]
$ echo "Hello World!"
Hello World!
    
por 16.09.2016 / 14:17
0

Para aqueles que estão usando o git bash no windows, a resposta aceita do @DanielPittman funciona. No entanto, você deve substituir a barra invertida (\) por uma barra (/).

Por exemplo, no unix, seria algo como 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 de autorização)

curl https://abc.com/services -H 'Authorization: Bearer 111A80BBZZCnS/!ZR412543s'

    
por 16.01.2018 / 05:01