-
Todos os seus problemas estão relacionados à cotação, não ao ambiente.
- Ambiente para um comando.
When a shell runs an external executable as a command, we can pass environment variables into the executable.
Sim, essa é uma maneira de definir variáveis de ambiente para um comando, externo ou de outra forma.
Mas o que está faltando nesta linha [a] :
$ var=3 /bin/echo "$var"
É que o shell expande a variável ao construir os argumentos e, se a variável
var
não estiver definida no shell que inicia o comando, isso é o que é realmente executado:$ var=3 /bin/echo ""
Para realmente ver a presente expansão do shell, execute isto:
$ var=RunningShell ; var=3 /bin/echo "$var" RunningShell
Uma maneira (muitas vezes insegura) de atrasar a avaliação da variável é:
$ var=3 eval /bin/echo '"$var"' 3
No segundo exemplo, você tem as citações trocadas:
$ var=3 bash -c "/bin/echo '$var'"
Imprime nada quando a linha de comando atual se torna:
$ var=3 bash -c "/bin/echo ''"
Como o valor da variável (não definida) $ var é expandido. Você provavelmente quis dizer isso:
$ var=thisis3 bash -c '/bin/echo "$var"' thisis3
Nesse caso, as aspas simples impedem a expansão da variável pelo shell de execução, deixando a expansão para o shell executado (
bash -c
).-
Use env para realmente ver o ambiente.
- Quando um programa é executado por exec, quero ver se a variável de ambiente também funciona:
Não execute em seu shell atual, pois ele fechará o shell em execução.
Você pode fazer isso para evitar fechar o shell em execução:$ var=3 exec /bin/echo \$var | cat $var
Como o shell fechado será aquele que seria fechado de qualquer maneira, o primeiro sub-shell de um pipe.
Mas isso não mostrará o valor de var no ambiente. Para ver variáveis no ambiente, use o comando para ver o ambiente:
$ var=3 env | grep var var=3
- Ambiente para um comando.
[a]
O comando que você escreveu teve backquotes '
, alterando-as para aspas simples evitará a expansão da variável e imprimirá $var
.:
$ var=3 /bin/echo '$var'
$var