Quais são as principais diferenças entre $ ENV_VAR e 'env_var'?

1

É uma pergunta muito simples: Quais são as principais diferenças entre usar variáveis de ambiente como $ HOSTNAME e 'hostname'. Onde é que apropriado, por que existem duas possibilidades para representá-los?

    
por Michael 03.01.2012 / 16:04

2 respostas

2

Uma variável de ambiente é definida de uma vez por todas (para um determinado processo; quando um processo inicia outro, o filho herda o ambiente do pai). Portanto, acessar $HOSTNAME lê diretamente um valor na memória. Em contraste, cada vez que você avaliar a substituição do comando 'hostname' (também escrito $(hostname) ), isso executará o comando hostname .

No caso de $HOSTNAME e hostname , na prática, não faz diferença. $HOSTNAME é marginalmente mais rápido. Em princípio, $HOSTNAME pode estar errado se você executar HOSTNAME=some_bogus_value (considerando que $(hostname) pode estar errado se você colocar algum programa hostname diferente no seu $PATH ) e apenas hostname acompanhar -data se você alterar seu nome de host.

Geralmente, há (mas nem sempre) uma variável de ambiente HOSTNAME , porque ela é usada com frequência (por exemplo, em prompts de shell) e quase nunca muda. Há um comando hostname (na maioria dos sistemas) para definir o valor de HOSTNAME ( HOSTNAME=$(hostname) ) e para alterar o nome do host ( hostname $(cat /etc/hostname) , normalmente feito no início do processo de inicialização).

    
por 04.01.2012 / 00:37
3

É apropriado depender dos comandos que buscam o valor atual do que as variáveis que podem ficar obsoletas durante um período de tempo nas sessões autônomas.

[centos@abc ~]$ /bin/hostname
abc.dns.com
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$ uname -n
abc.dns.com

[centos@abc ~]$ sudo /bin/hostname xyz.dns.coom
[centos@abc ~]$ uname -n
xyz.dns.coom
[centos@abc ~]$ /bin/hostname
xyz.dns.coom
[centos@abc ~]$ echo $HOSTNAME
abc.dns.com
[centos@abc ~]$ 

Eu acho claro que $HOSTNAME é uma variável shell, que é expandida / avaliada capturando a saída de /bin/hostname no início da inicialização do shell e não é atualizada toda vez ou se o nome do host é dinâmico. Dependendo da saída de /bin/hostname é mais confiável que $ HOSTNAME, a menos que seja o mesmo script ou programa que já avaliou o nome do host no mesmo espaço de programa.

Bem, em resumo, a saída dos comandos /bin/hostname ou /bin/uname -m é o método mais apropriado para saber o nome do host do que apenas usar $ HOSTNAME (que pode se tornar obsoleto como qualquer outra variável SHELL normal).

Se você está curioso para saber como o shell recebe $ HOSTNAME herdado, então é correto saber que o shell lê seus arquivos de inicialização global (rc) como / etc / profile (ou / etc / bashrc) que tem essa variável definida novamente saída de /bin/hostname .

(Também é importante saber que outros programas além do shell sem executar o comando /bin/hostname anterior podem ter a variável HOSTNAME definida / inicializada por causa do script de inicialização do sistema chamado /etc/rc.sysinit )

    
por 03.01.2012 / 16:19