De vez em quando eu mostro um script bash e me parece que existem algumas maneiras de definir uma variável:
key=value
env key=value
export key=value
Quando você está dentro de um script ou de um único comando (por exemplo, costumo encadear uma variável com um iniciador do Wine para definir o prefixo correto do Wine), elas parecem ser totalmente intercambiáveis, mas certamente esse não pode ser o caso.
Qual é a diferença entre esses três métodos e você pode me dar um exemplo de quando eu gostaria especificamente de usar cada um?
Definitivamente relacionado a Qual é a diferença entre `VAR = ...` e `export VAR = ...`? mas também quero saber como isso env
se encaixa e alguns exemplos mostrando os benefícios de cada um também seriam bons :)
command-line
bash
Oli
fonte
fonte
export key=value
sintaxe é estendida e não deve ser usada em scripts portáteis (ou seja#! /bin/sh
).Respostas:
Vamos considerar um exemplo específico. O
grep
comando usa uma variável de ambiente chamadaGREP_OPTIONS
para definir opções padrão.Agora. Dado que o arquivo
test.txt
contém as seguintes linhas:executando o comando
grep one test.txt
retornaráSe você executar grep com a
-v
opção, ele retornará as linhas não correspondentes, portanto a saída será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.O resultado:
Obviamente, a opção
-v
não foi aprovadagrep
.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
que retornará o esperado
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:
retorna agora
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. Quandoenv
é chamado, acontece o seguinte:env
é executado como um novo processoenv
modifica o ambiente eenv
processo é substituído pelocommand
processo.Exemplo:
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 executarNo 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 dasystem()
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 aexecvp()
função que pesquisa através daPATH
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:
em vez de iniciar o Calibre, resultará em
fonte
env
vêm todas as variáveis ? Quero dizer, quando você abre um novo shell, sempre tem algumas variáveis. Então, algum programa deve terexport
editado isso, certo?set var=blah
?