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
export
não serão herdadas no ambiente dos comandos que você está chamando.GREP_OPTIONS='-v' grep one test.txt
O resultado:
line one
Obviamente, a opção
-v
nã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 * ; do
você 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.txt
que retornará o esperado
line two
Você 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.txt
retorna agora
line two
Esta é 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 -
env
modifica 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.txt
Este 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.txt
No 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!