Como definir uma variável de ambiente apenas pela duração do script?

127

No Linux (Ubuntu 11.04) no bash, é possível definir temporariamente uma variável de ambiente que será diferente apenas da variável normal durante o script? Por exemplo, em um script de shell, tornando um aplicativo que salva no HOME portátil, configurando temporariamente o HOME como uma pasta no diretório de trabalho atual e iniciando o aplicativo.

suchipi
fonte
5
Seria mais difícil se você queria a definição para durar para além da duração do script
Nemo

Respostas:

119
VAR1=value1 VAR2=value2 myScript args ...
Rockallite
fonte
2
Eu já fiz isso várias vezes para executar vblank_mode=0 glxgears. Funciona, mas também diz vblank_mode=0: command not foundapós a execução, enquanto a adição envnão causa isso. [testando ...] Aparentemente, o zsh não gosta (ainda o usa corretamente), mas o bash é bom com ele. Acho que vou seguir com o envmétodo a partir de agora.
Chinoto Vokro
2
com scripts funciona, mas VAR1="hello" echo $VAR1que tal não retorna nada?
Zibri
2
@ Zibri, é sobre quando a expansão está acontecendo. Provavelmente, você pode fazer algo assim:VAR1="hello" bash -c 'echo $VAR1'
Cybergrind
Voto positivo por mostrar que isso é possível mesmo para várias variáveis ​​de ambiente.
Binarus 22/01
70
env VAR=value myScript args ...
Glenn Jackman
fonte
18
OuVAR=value myScript args ...
Rockallite
9
1. Como é PATH=$PATH:XYZ echo $PATH | grep XYZque não tem saída? 2. Qual é a diferença entre usar e não usar env?
qubodup
18
porque o shell expande a variável PATH antes de executar o comando echo. Você precisa adiar essa expansão. Uma maneira: PATH=$PATH:XYZ sh -c 'echo $PATH' | grep XYZ- as aspas simples são a chave aqui
glenn jackman
14
Qual é a diferença entre usá-lo enve não usá-lo?
Mohammed Noureldin 01/01
Isso não parece funcionar em um oneliner comoIFS=$'\n' for l in lines; do ... done
drevicko 08/07/19
31

Apenas coloque

export HOME=/blah/whatever

no ponto do script em que você deseja que a alteração ocorra. Como cada processo possui seu próprio conjunto de variáveis ​​de ambiente, essa definição automaticamente deixará de ter algum significado quando o script terminar (e com ele a instância do bash que possui um ambiente alterado).

hmakholm deixou sobre Monica
fonte
11
Isso é enganador. exportpassará a variável para subshells, mas não controla o shell pai. Se você estiver escrevendo um script que comece com "#! / Bin / sh" ou algo semelhante, QUALQUER variável que você definir desaparecerá quando o script sair.
brightlancer
1
@brightlancer, isso é verdade, mas não parece contradizer tudo o que escrevi. (Com a exceção da possibilidade de o script iniciar um processo em segundo plano, mas acho que isso está além do nível de sofisticação do OP e seria apenas confuso).
hmakholm deixou Monica em
5
A exportação é desnecessária. Além disso, sua resposta só funciona se o script dele chamar um intérprete (#! / Bin / sh ou algo semelhante). Se o "script" dele não persistir, o que você acabou de dizer continuará além do final do script. Foi por isso que eu disse que sua resposta era enganosa - pode estar correta, pode não, mas definitivamente tem uma parte que é desnecessária e confusa porque pode levar alguém a pensar que "exportar" é o elemento necessário que ele estava procurando.
brightlancer
7
@brightlancer: A exportação é necessária se o script do OP invocar sub-scripts que dependem de $ HOME, e não ousei supor que não fosse esse o caso. Além disso, o bash gerará um subshell para executar um script, mesmo que o script não tenha uma linha shebang, mas seja apenas um arquivo de texto com o bit de execução definido. Experimente - as atribuições de variáveis ​​no script não são visíveis no shell de onde você o invocou. É somente se você explicitamente sourceo script que será executado pelo mesmo shell em que você digitou o comando.
hmakholm deixou Monica em
4
@brightlancer: A exportação é necessária se ele quiser $HOMEser herdado por qualquer comando executado a partir do script. E se ele não o fizer, e a configuração de $HOMEfor apenas para o benefício do próprio script, provavelmente seria melhor modificar o script para que ele se refira a algo diferente $HOME.
Keith Thompson