Vamos considerar um exemplo específico. O grepcomando usa uma variável de ambiente chamada GREP_OPTIONSpara definir opções padrão.
Agora. Dado que o arquivo test.txtcontém as seguintes linhas:
line one
line two
executando o comando grep one test.txtretornará
line one
Se você executar grep com a -vopção, ele retornará as linhas não correspondentes, portanto a saída será
line two
Agora tentaremos 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.txt
O resultado:
line one
Obviamente, a opção -vnão foi aprovada grep.
Você deseja usar este formulário quando estiver configurando uma variável apenas para o shell usar, por exemplo, se for i in * ; dovocê não deseja exportar $i.
No entanto, a variável é transmitida para o ambiente dessa linha de comando específica, para que você possa fazer
GREP_OPTIONS='-v' grep one test.txt
que retornará o esperado
line two
Você usa este formulário para alterar temporariamente o ambiente dessa instância específica do programa iniciado.
Exportar uma variável faz com que a variável seja herdada:
export GREP_OPTIONS='-v'
grep one test.txt
retorna agora
line two
Essa é a maneira mais comum de definir variáveis para uso de processos iniciados posteriormente em um shell
Tudo isso foi feito no bash. exporté um bash embutido; VAR=whateveré a sintaxe do bash. env, por outro lado, é um programa em si. Quando envé chamado, acontece o seguinte:
- O comando
envé executado como um novo processo
env modifica o ambiente e
- chama o comando que foi fornecido como argumento. O
envprocesso é substituído pelo commandprocesso.
Exemplo:
env GREP_OPTIONS='-v' grep one test.txt
Este comando iniciará dois novos processos: (i) env e (ii) grep (na verdade, o segundo processo substituirá o primeiro). Do ponto de vista do grepprocesso, o resultado é exatamente o mesmo que executar
GREP_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 exec()família de funções em vez da system()chamada).
Nota adicional sobre #!/usr/bin/env
É também por isso que o idioma #!/usr/bin/env interpreteré usado em vez de #!/usr/bin/interpreter. envnão requer um caminho completo para um programa, porque usa a execvp()função que pesquisa através da PATHvariável, exatamente como um shell, e depois se substitui pela execução do comando. Assim, ele pode ser usado para descobrir onde um intérprete (como perl ou python) "fica" no caminho.
Isso também significa que, modificando o caminho atual, você pode influenciar qual variante 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 iniciar o Calibre, resultará em
I am an evil interpreter!
export key=valuesintaxe é estendida e não deve ser usada em scripts portáteis (ou seja#! /bin/sh).