-
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
varnã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" RunningShellUma maneira (muitas vezes insegura) de atrasar a avaliação da variável é:
$ var=3 eval /bin/echo '"$var"' 3No 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"' thisis3Nesse 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 $varComo 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