Eu suspeito que você queira que as variáveis shell tenham um escopo limitado, em vez de variáveis de ambiente. Variáveis de ambiente são uma lista de strings passadas para comandos quando são executadas .
Em
var=value echo whatever
Você está passando a string var=value
para o ambiente que o echo recebe. No entanto, echo
não faz nada com sua lista de ambientes e, de qualquer forma, na maioria dos shells, echo
é construído e, portanto, não executado .
Se você tivesse escrito
var=value sh -c 'echo "$var"'
Isso teria sido outro assunto. Aqui, estamos passando var=value
para o comando sh
e sh
por acaso usa seu ambiente. Shells convertem cada uma das variáveis que recebem de seu ambiente para uma variável de shell, portanto a var
variável de ambiente sh
recebe será convertida em uma variável $var
e, quando expandida, na linha de comando echo
, que se tornará echo value
. Como o ambiente é herdado por padrão, echo
também receberá var=value
em seu ambiente (ou seria se ele fosse executado), mas novamente, echo
não se importa com o ambiente.
Agora, se, como suspeito, o que você quer é limitar o escopo das variáveis do shell, existem várias abordagens possíveis.
Portável (Bourne e POSIX):
(var=value; echo "1: $var"); echo "2: $var"
O (...) acima inicia um sub-shell (um novo processo de shell na maioria dos shells), então qualquer variável declarada lá afetará apenas o sub-shell, então eu esperaria que o código acima fosse "1 : valor "e" 2: "ou" 2: whatever-var-foi-definido-para-antes ".
Com a maioria dos shells parecidos com Bourne, você pode usar funções e o "local" interno:
f() {
local var
var=value
echo "1: $var"
}
f
echo "2: $var"
Com o zsh, você pode usar funções embutidas:
(){ local var=value; echo "1: $var"; }; echo "2: $var"
ou:
function { local var=value; echo "1: $var"; }; echo "2: $var"
Com o bash e o zsh (mas não ash, pdksh ou AT & T ksh), esse truque também funciona:
var=value eval 'echo "1: $var"'; echo "2: $var"
Uma variante que funciona em mais alguns shells ( dash
, mksh
, yash
), mas não zsh
(a menos que em sh
/ ksh
emulation):
var=value command eval 'echo "1: $var"'; echo "2: $var"
(usar command
na frente de um especial embutido (aqui eval
) em POSIX shells remove seu especialismo (aqui as designações de variáveis delas permanecem válidas depois que retornarem))