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).