Gerando Argumentos do Comando Citados

2

Estou trabalhando com uma API HTTP que exige um conjunto muito particular de cabeçalhos assinados + corpo JSON. E eu realmente quero enlouquecer por depuração e sanidade em geral.

Então, eu escrevi um pequeno script que, dado o nome do host, o caminho e o corpo, faz toda a confusão e então escreve qual deve ser a linha de comando do cURL. por exemplo.

./sign example.com /api/v1/foo/bar '{"foo":"bar"}'
example.com/api/v1/foo/bar -H 'x-sign:XXXXX', -H ... --data-binary '{"foo":"bar","sign":"xxx"}'

(Sim, parece bastante complicado ...)

Espero que isso seja facilmente habilitado para shell (em ZSH):

curl -v $(./sign ...)

Mas isso me dá todos os tipos de erros de citação (ou tenta encurralar o cabeçalho como URLs, dependendo de como eu cito).

A única maneira de trabalhar parece muito desajeitada para ser ... real:

sh -c "curl -v $(./sign ...)"

Estou pensando que estou perdendo algumas opções de cotação aqui. Quaisquer dicas sobre como obter este "bom"?

    
por Morten Siebuhr 22.08.2018 / 15:36

1 resposta

0

Seu ./sign gera o código do shell, portanto, ele deve ser avaliado como tal, seja por sh com seu sh -c ou o shell atual com eval :

eval "curl -v $(sign...)"

Com zsh , você também pode interpretar apenas as citações nele (não as expansões que esse código de shell pode fazer) com:

curl -v "${(@Q)${(z)"$(sign)"}}"

Onde (z) interpreta a citação e (Q) remove as aspas (e (@) entre aspas preserva os elementos vazios).

Se sign produz "foo bar" "$(echo test)" , o primeiro chamaria curl com foo bar e test como argumentos, enquanto o segundo chamaria curl com foo bar e $(echo test) como argumentos .

    
por 22.08.2018 / 17:35