Vamos considerar um exemplo específico. O comando grep usa uma variável de ambiente chamada GREP_OPTIONS para definir opções padrão.
Agora. Dado que o arquivo test.txt contém as seguintes linhas:
line one
line two
executando o comando grep one test.txt retornará
line one
Se você executar o grep com a opção -v , ele retornará as linhas não correspondentes, então a saída será
line two
Vamos agora tentar definir a opção com uma variável ambiental.
-
As variáveis de ambiente definidas sem
exportnão serão herdadas no ambiente dos comandos que você está chamando.GREP_OPTIONS='-v' grep one test.txtO resultado:
line oneObviamente, a opção
-vnão foi passada paragrep.Você deseja usar este formulário quando estiver definindo uma variável somente para o shell a ser usado, por exemplo, em
for i in * ; dovocê não deseja exportar$i. -
No entanto, a variável é passada para o ambiente daquela linha de comando em particular, então você pode fazer
GREP_OPTIONS='-v' grep one test.txtque retornará o esperado
line twoVocê usa este formulário para alterar temporariamente o ambiente desta instância específica do programa lançado.
-
Exportar uma variável faz com que a variável seja herdada:
export GREP_OPTIONS='-v' grep one test.txtretorna agora
line twoEsta é a forma mais comum de definir variáveis para o uso de processos subsequentemente iniciados em um shell
-
Tudo isso foi feito no bash.
exporté um bash embutido;VAR=whateveré a sintaxe bash.env, por outro lado, é um programa em si. Quandoenvé chamado, as seguintes coisas acontecem:- O comando
envé executado como um novo processo -
envmodifica o ambiente e - chama o comando que foi fornecido como um argumento. O processo
envé substituído pelo processocommand.
Exemplo:
env GREP_OPTIONS='-v' grep one test.txtEste comando lançará dois novos processos: (i) env e (ii) grep (na verdade, o segundo processo substituirá o primeiro). Do ponto de vista do processo
grep, o resultado é exatamente o mesmo que em execuçãoGREP_OPTIONS='-v' grep one test.txtNo entanto, você pode usar esse idioma se estiver fora do bash ou não quiser iniciar outro shell (por exemplo, quando estiver usando a família de funções
exec()em vez da chamadasystem()). - O comando
Nota adicional sobre #!/usr/bin/env
É também por isso que o idioma #!/usr/bin/env interpreter é usado em vez de #!/usr/bin/interpreter . env não requer um caminho completo para um programa, porque ele usa a função execvp() que pesquisa a variável PATH da mesma forma que um shell, e então substitui pelo comando run . Assim, ele pode ser usado para descobrir onde um interpretador (como perl ou python) "se senta" no caminho.
Isso também significa que, modificando o caminho atual, você pode influenciar qual variante do python será chamada. Isso possibilita o seguinte:
echo -e '#!/usr/bin/bash\n\necho I am an evil interpreter!' > python
chmod a+x ./python
export PATH=.
calibre
em vez de lançar o Caliber, resultará em
I am an evil interpreter!