Quando você usa LANG=C gcc ...
o que acontece é que o shell define LANG para gcc
o ambiente da única , e não para o atual ambiente em si ( ver nota ). Portanto, após a gcc
conclusão, LANG
volta ao seu valor anterior (ou não definido).
Além disso, quando você o usa A=10 echo $A
, é o shell que substitui $ A, não eco, e essa substituição (chamada "expansão") ocorre antes da avaliação da instrução (incluindo a atribuição), portanto, para funcionar como A
o valor esperado já deve estar definido no ambiente atual anterior a essa declaração.
É por isso A=10 echo $A
que não funciona conforme o esperado: A=10
será definido para eco, mas o eco ignora internamente o valor da variável de ambiente A
. E $A
é substituído pelo valor definido no shell atual (que não é nenhum) e depois passado como argumento para eco.
Portanto, o seu pressuposto é correto: VAR=value command
faz o trabalho, mas isso só é relevante se command
internamente usa VAR. Caso contrário, você ainda pode passar value
como argumento para command
, mas os argumentos são substituídos pelo shell atual ; portanto, eles devem ser definidos antes do uso:VAR=value; command "$VAR"
Se você sabe como criar um script executável, tente isso como um teste:
#!/bin/sh
echo "1st argument is $1"
echo "A is $A"
Salve-o como testscript
e tente:
$ A=5; A=10 testscript "$A"; echo "$A"
1st argument is 5
A is 10
5
Por último, mas não menos importante, vale a pena conhecer a diferença entre as variáveis shell e de ambiente e os argumentos do programa .
Aqui estão algumas boas referências:
.
(*) Nota: tecnicamente, o shell não definida no ambiente atual também, e aqui está o porquê: Alguns comandos, como echo
, read
e test
são builtins shell , e como tal eles não gerar um processo filho. Eles são executados no ambiente atual. Mas o shell cuida da tarefa apenas durando até que o comando seja executado; portanto, para todos os efeitos práticos, o efeito é o mesmo: a tarefa é vista apenas por esse único comando.
A=10 (echo $A)
e receber10
?