Variáveis do shell são inicializadas a partir de variáveis de ambiente em cada shell, você não pode contornar isso.
Quando o shell é iniciado, para cada variável de ambiente que recebe um nome válido como uma variável de shell, o shell designa a variável de shell correspondente ao valor correspondente. Por exemplo, se o seu script for iniciado como:
env VAR_A=xxx your-script
(e tem #!/bin/bash -
she-bang), env
executará /bin/bash
e passará VAR_A=xxx
nesse comando bash e bash
atribuirá a variável $VAR_A
o valor xxx
.
No shell Bourne e no C-shell, se você atribuir um novo valor a essa variável do shell, isso não afetará a variável env correspondente passada para comandos posteriores executados por esse shell, você precisará usar export
ou setenv
para isso (observe que no shell Bourne se você usa unset
a, ele remove tanto a variável do shell quanto a variável de ambiente).
Em:
env VAR=xxx sh -c 'VAR=yyy; other-command'
(com sh
sendo o shell Bourne, não os atuais POSIX shells) ou:
env VAR=xxx csh -c 'set VAR = yyy; other-command'
other-command
recebe VAR=xxx
em seu ambiente, não VAR=yyy
, você precisaria escrevê-lo:
env VAR=xxx sh -c 'VAR=yyy; export VAR; other-command'
ou
env VAR=yyy csh -c 'setenv VAR yyy; other-command'
Por other-command
para receber VAR=yyy
em seu ambiente.
No entanto, ksh
(e POSIX como resultado, e então bash
e todos os outros tipos de Bourne como resultado) quebraram isso.
Após o start-up, essas shells modernas ligam sua variável shell à variável de ambiente correspondente.
O que isso significa é que um script pode destruir o ambiente apenas definindo uma de suas variáveis, mesmo se não exportá-lo. Alguns shells são conhecidos por remover as variáveis de ambiente que ele não pode mapear para as variáveis do shell (por isso é recomendado usar apenas nomes de variáveis mapeáveis por shell para nomes de variáveis de ambiente).
Essa é a principal razão pela qual, por convenção, todas as variáveis maiúsculas devem ser reservadas para variáveis de ambiente.
Para contornar isso, se você quiser que os comandos executados por seu script recebam o mesmo ambiente que o interpretador de shell recebido, você precisará armazenar esse ambiente de alguma forma. Você pode fazer isso adicionando:
my_saved_env=$(export -p)
no início do seu script e, em seguida, execute seus comandos com:
(eval "$my_saved_env"; exec my-other-command and its args)