Por que o bash interpretando caracteres que escapei do caractere? [duplicado]

3

Por que quando executo o curl em uma API REST, os caracteres especiais (!) na minha chave são interpretados pelo shell?

curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"  
-bash: !AQYAQGgmLxxxxxxxxxx'": event not found

De acordo com isso , usar uma única citação deve impedir que o bash interpete a string

Como solução alternativa, tentei usar um caractere \, mas isso faz com que a chave seja rejeitada.

curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx'"  
[{"message":"Session expired or invalid","errorCode":"INVALID_SESSION_ID"}]

Como posso evitar que o bash interprete a string?

    
por spuder 10.08.2013 / 01:01

4 respostas

3

O caractere de expansão de histórico ! é especial mesmo quando está entre aspas duplas, mas perde seu significado especial entre aspas simples.

Aqui, está dentro de uma string com aspas duplas "Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'" . As aspas simples nessa cadeia são caracteres comuns nessa cadeia, elas não são interpretadas especialmente. Não há uma string entre aspas simples aqui.

Se você adicionar uma barra invertida, ele protege a ! da expansão do histórico de acionamento, mas a própria barra invertida permanece. Então você acaba com o cabeçalho Authorization: Bearer '00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx' .

Se o cabeçalho precisar ser Authorization: Bearer '00DE0000000K0eM!AQYAQGgmLxxxxxxxxx' , você pode especificá-lo desta maneira:

curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '\''00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'\'
    
por 10.08.2013 / 01:07
1

Porque você envolve toda a string com aspas duplas! é interpretado (as aspas simples são tratadas como uma string contida nas aspas duplas).

Tente:

curl https://foo.my.salesforce.com/services/data/v28.0/ -H 'Authorization: Bearer '"'"'00DE0000000K0eM!AQYAQGgmLxxxxxxxxxxx'"'"  

Mais de uma string citada pode ser usada em uma linha. Também estou usando aspas duplas para agrupar aspas simples, de forma que elas sejam tratadas como uma string e não como um marcador de limite de string.

    
por 10.08.2013 / 01:08
1
bash-4.2$ printf '%s\n' "aa'bb!cc'dd"
bash: !cc'dd": event not found (Not good)

bash-4.2$ printf '%s\n' "aa'bb\!cc'dd"
aa'bb\!cc'dd (Not good)

bash-4.2$ printf '%s\n' "aa'bb"\!"cc'dd"
aa'bb!cc'dd (Good)

bash-4.2$ printf '%s\n' "aa'bb"'!'"cc'dd"
aa'bb!cc'dd (Good)

Ou seja, o estrondo precisa ser escapado por aspas simples ou uma barra invertida (aspas duplas não escapam delas). Uma barra invertida entre aspas duplas impedirá a expansão do histórico, mas a barra invertida permanecerá.

A esse respeito, o comportamento bash é diferente daquele de (t)csh (do qual bash emprestou esse recurso) ou zsh que remove essa barra invertida que foi usada para escapar de ! como você espere.

Se você nunca usa a expansão do histórico, também pode desativá-lo para salvar esse tipo de problema com:

set +H
    
por 10.08.2013 / 09:01
0

O ! seguido por ... coisas .. no shell Bash significa extrair valores do histórico do seu shell. Você pode ver o histórico com o comando history . É uma lista de comandos que você executou anteriormente.

Para dissuadir o shell de interpretar este caractere, simplesmente coloque seu argumento entre aspas simples ( ' ) ou escape do ! . No seu caso, apenas o escape deve ser suficiente, e solte as aspas simples ( ' ).

$ curl https://foo.my.salesforce.com/services/data/v28.0/ -H "Authorization: Bearer 00DE0000000K0eM\!AQYAQGgmLxxxxxxxxx"
    
por 10.08.2013 / 01:11

Tags