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))