estou com um problema, meu comando para mim está funcionando, mas o comando export test=test não funciona no comando com jq, mas se eu executar apenas export test=test está funcionando
então eu tenho o arquivo test.json dentro:
{ "test":"test124","url":"google.com"}
então eu uso este comando:
jq -r 'to_entries | .[] | "export \(.key)=\(.value)"' test.json | sh
eu faço o check-in no ambiente e não vejo nada
eu tento este comando:
jq -r 'to_entries | .[] | "\(.key)=\(.value)"' test.json | while IFS='=' read -r key value; do export "$key=$value"; ; done
mesmo problema
mas se eu colocar este comando está funcionando:
export test=$(jq -r .test test.json)
mas eu quero fazer um loop :/
obrigado pela ajuda
SOLUÇÃO: faltando $(...)
$(jq -r 'to_entries | .[] | "export \(.key)=\(.value)"' test.json)
O principal problema em suas tentativas iniciais é definir as variáveis de ambiente em algum outro ambiente (o ambiente do
sh
shell iniciado na primeira instância e o ambiente do subshell que executa owhile
loop na outra instância). O ambiente e suas variáveis são removidos quando o shell ou subshell termina.Dado um arquivo JSON simples como este:
... podemos criar um fragmento de script de shell que exporta cada chave como uma variável de ambiente com o valor de string fornecido (decodificado):
ou, um pouco mais curto,
O
@sh
operador injq
tenta fazer a coisa certa com a string fornecida, produzindo uma string de shell entre aspas, esperançosamente válida.Com meu documento JSON de exemplo acima, isso geraria
Isso poderia ser avaliado em um shell usando
eval
(observe a substituição do comando entre aspas duplas; precisamos preservar os espaços em branco na saída dejq
):Então...
Observe que isso não verifica a validade dos nomes das variáveis. No entanto, ele suporta variáveis contendo novas linhas e também preserva outros caracteres de espaço em branco.
Porém, você pode construir strings JSON que não podem ser convertidas em valores de string válidos no shell em todas as localidades, e há problemas de segurança com esse tipo de abordagem em geral. Veja, por exemplo, a resposta relacionada de Stéphane Chazelas aqui: https://unix.stackexchange.com/a/681375/116858