Vamos considerar um exemplo específico. O grep
comando 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 grep com a -v
opçã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 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 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 * ; do
você 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
env
processo é substituído pelo command
processo.
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 grep
processo, 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
. env
não requer um caminho completo para um programa, porque usa a execvp()
função que pesquisa através da PATH
variá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=value
sintaxe é estendida e não deve ser usada em scripts portáteis (ou seja#! /bin/sh
).