eval não está avaliando o eco? [duplicado]

1

Eu estou tentando escrever algo que armazena um token de acesso à API em uma variável bash, então estou modelando em ssh-agent , onde você usa eval .

ssh-agent

Se você executar ssh-agent por si só, exibirá algo como o seguinte:

SSH_AUTH_SOCK=/tmp/ssh-XXXXXXXXXXXX/agent.NNNNN; export SSH_AUTH_SOCK;
SSH_AGENT_PID=NNNNN; export SSH_AGENT_PID;
echo Agent pid NNNNN;

E se você executá-lo com eval $(ssh-agent) , o resultado será:

Agent pid NNNNN

... e os eval resultam nas variáveis de ambiente que estão sendo definidas no seu shell atual.

meu script

O final do meu script é assim ( $JSON veio de algum comando curl anterior):

cat <<EOF
API_ACCESS_TOKEN=$(echo $JSON | jq '.access_token')
API_EXPIRES_AT=$(echo $JSON | jq '.expires_at')
export API_ACCESS_TOKEN API_EXPIRES_AT
echo OK
EOF

Quando eu executo com eval $(./auth) , está configurando corretamente $API_ACCESS_TOKEN e $API_EXPIRES_AT (então o eval funciona), mas não está imprimindo "OK" .

O que estou fazendo de errado?

    
por Roger Lipscombe 15.12.2017 / 12:18

2 respostas

3

Dê uma olhada nessa saída de ssh-agent novamente. Você está perdendo a terminação ; após cada comando.

Com isso, o script fará o que você quiser.

Sem os ponto-e-vírgulas, o shell executará os comandos na string (o here-document) como um comando com as novas linhas removidas.

    
por 15.12.2017 / 12:27
3

Isso também parece um problema de divisão de palavras. O script gera (essencialmente) isso:

VAR=foo
export VAR
echo OK

Mas como você usou uma substituição de comando sem aspas, ela é dividida e dada a eval como palavras distintas, como se você tivesse digitado:

eval VAR=foo export VAR echo OK

Depois disso, o declare do Bash mostra que echo e OK são exportados, embora não definidos:

$ declare -p echo
declare -x echo

Então você precisa citar a subestação do comando ( eval "$(./auth)" ) ou colocar os ponto-e-vírgulas como ssh-agent .

    
por 15.12.2017 / 12:28

Tags