
Defino algumas variáveis de ambiente em um terminal e executo meu script. Como posso extrair as variáveis do script? Preciso saber seus valores. Simplesmente referir-se a eles como $MY_VAR1
não funciona; ele está vazio.
Responder1
Se as variáveis forem verdadeiramente variáveis de ambiente (ou seja, foram exportadas com export
) no ambiente que invoca seu script, então elasseriaestar disponível em seu script. O fato de não serem, sugere que você não os exportou ou que executou o script em um ambiente onde eles simplesmente não existem, mesmo como variáveis de shell.
Exemplo:
$ cat script.sh
#!/bin/sh
echo "$hello"
$ sh script.sh
(uma linha de saída vazia, pois hello
não existe em lugar nenhum)
$ hello="hi there"
$ sh script.sh
(ainda apenas uma linha vazia como saída, pois hello
é apenas uma variável de shell, não uma variável de ambiente)
$ export hello
$ sh script.sh
hi there
Alternativamente, para definir a variável de ambiente apenas para este script e não no ambiente de chamada:
$ hello="sorry, I'm busy" sh script.sh
sorry, I'm busy
$ env hello="this works too" sh script.sh
this works too
Responder2
Você precisa garantir a exportação das variáveis de ambiente às quais deseja ter acesso em seu script antes de invocá-lo. Ou seja:
Unix> export MY_TEMP=/tmp
Unix> some_script.sh
Agora some_script.sh teria acesso a $MY_TEMP - quando você invoca um script de shell, você obtém um novo ambiente, apenas com variáveis exportadas, a menos que você o "fonte" precedendo o comando do script com um ponto final (".") e um espaço e, em seguida, o nome do seu script:
Unix> . some_script.sh # runs in current environment
Dica de depuração: inclua próximo ao topo do seu script o set
comando para ver quais variáveis seu script pode ver.
Responder3
Observe também que se você deseja que eles vivam apenas "durante a execução do script", você pode colocar as exportações deles em um arquivo e, em seguida, originar esse arquivo em seu script.
Porque quando você executa um script, ele será executado em um novo shell, desta forma essas variáveis serão exportadas apenas naquele subshell (e seus descendentes) e não irão para o seu próprio shell, ou seja, parecerá que se você os desativa automaticamente após o término da execução do script.
Exemplo:
# config.txt
export SECRET=foobar
# prog.sh
#!/usr/bin/env sh
source ./config.txt
echo $SECRET
Agora execute:
chmod +x prog.sh
./prog.sh
e confirme se a variável SECRET não vazou para seu próprio shell:
echo $SECRET # <-- must echo a blank line