Como mostrar o valor atual de uma variável de ambiente?

24

Quando verifico o ambiente do meu sistema, muitas variáveis ​​ambientais são exibidas. Como posso procurar apenas uma variável específica?

Um livro que estou lendo diz:

Às vezes, o número de variáveis ​​em seu ambiente cresce bastante, tanto que você não deseja ver todos os valores exibidos quando estiver interessado em apenas um. Se for esse o caso, você pode usar o echocomando para mostrar o valor atual de uma variável de ambiente.

Como faço isso em um terminal Linux?

iLearnSlow
fonte

Respostas:

25

Somente:

echo "$VARIABLENAME"

Por exemplo, para a variável de ambiente $HOME, use:

echo "$HOME"

Que, em seguida, imprime algo semelhante a:

/home/username

Edit : de acordo com o comentário de Stéphane Chazelas , pode ser melhor se você usar em printenvvez de echo:

printenv HOME
caos
fonte
4
Você esqueceu as aspas (a menos que esteja implicando na sintaxe zsh ou rc / es). echoé uma má escolha de um comando, pois pode transformar o conteúdo da variável. Ele exibirá o conteúdo do parâmetro shell com o mesmo nome. Isso não é necessariamente o mesmo se você estiver usando o shell Bourne ou em ambientes como 1, *por exemplo. E você não pode usar essa abordagem para envs cujo nome não é válido como um nome de variável do shell.
Stéphane Chazelas
5
Observe também que, se houver várias entradas de ambiente com o mesmo nome (OK, um caso patológico), qual delas você dependerá do shell (geralmente a primeira ou a última). printenv VARexibirá todos eles (pelo menos para a implementação GNU).
Stéphane Chazelas
9

Executando:

printenv

Você verá todas as variáveis ​​de ambiente. Para mais informações, você pode dar uma olhada em:

https://www.digitalocean.com/community/tutorials/how-to-read-and-set-environmental-and-shell-variables-on-a-linux-vps

Svetlin Tonchev
fonte
2
Para chegar perto de realmente responder à pergunta, printenv variablenameexibirá apenas a variável nomeada; por exemplo, printenv  HOMEfará aproximadamente a mesma coisa que echo  "$HOME".
G-Man Diz 'Reinstate Monica'
5

É importante entender que todo processo tem seu próprio conjunto de variáveis ​​de ambiente.

Quando um processo chama a chamada do fork()sistema, é criado um segundo processo (o filho ) idêntico ao primeiro ( o pai ) (esta cópia inclui o ambiente, que reside logo acima da pilha (ou logo abaixo, dependendo de como você pensa nas pilhas :-)- mas no unix / linux a pilha cresce a partir de endereços altos).

Geralmente, o processo filho chama a chamada de execve()sistema, que descarta tudo na memória (virtual) e a reconstrói das seções de código e dados no arquivo binário especificado.

No entanto, quando reconstrói a pilha, ele copia o ambiente e as seqüências de argumentos passadas para execve()a pilha primeiro (nessa ordem), antes de chamar a main()função (muito do trabalho é feito no crt0código de autoinicialização após os execve()retornos (para a entrada ponto especificado no binário)).

Existem invólucros para a execve()chamada do sistema na biblioteca C que passarão pelo ambiente atual (ou seja, uma cópia do ambiente dos pais), em vez de o responsável pela chamada (assim, na verdade, a criança herdará o ambiente dos pais) - veja environ(7).

Tente executar (como root) o comando ps axeww | less... isso mostrará o ambiente para todos os processos! Uma interessante é a identificação do processo 1 (ou seja, o initprocesso - o primeiro processo criado pelo kernel no momento da inicialização).

Se você deseja examinar o ambiente para um processo específico (e você sabe que é o ID do processo), tente executar o comando cat /proc/<PID>/environ(substituindo <PID>pelo ID do processo).

Observe que, se um processo tiver privilégios suficientes, ele pode reescrever sua própria pilha, o que pode dificultar o conhecimento de seu ambiente - você verá alguns processos daemon como esse na saída ps.

Mas, no final, todo esse waffle se resume ao que o @chaos disse acima, se você quiser examinar o valor atual de uma variável de ambiente específica no seu processo de shell, basta usar o comando echo "$<NAME>"( builtin) (substituindo <NAME>pelo nome do variável de ambiente em que você está interessado) ... esteja ciente de que a mesma variável pode ter um valor diferente ou não existir em outro processo.

Murray Jensen
fonte
1
(1) Observe que a eopção pse o /proc/…/environarquivo especial podem não existir em todos os sistemas. (2) AFAIK, todo processo Unix tem o privilégio de reescrever sua pilha e modificar suas variáveis ​​de ambiente. (3) Para mais discussões, consulte A quem pertencem as variáveis ​​de ambiente? (no superusuário ).
G-Man Diz 'Reinstate Monica'
Eu pensava que alguns sistemas tinham uma maneira de impedir que um processo sem privilégios "ocultasse" seus argumentos de linha de comando e ambiente, por exemplo, da execução de raiz ps... mas agora que você destacou esse ponto, não me lembro por que pensei que.
Murray Jensen
@MurrayJensen, de acordo com alguma discussão sobre a questão altamente votada que fiz sobre "enrolar" ocultando seus argumentos no ps - não é especificado no POSIX se o ps retorna os argumentos como originalmente passados ​​para o processo ou uma cópia que o processo pode ter modificado depois dele começasse. Algum sistema (acho que Solaris ??) mostra os argumentos originais, não importa o quê. (Aqui está o link.) Isso pode ter sido o que você estava pensando. :)
Wildcard
Bingo! Sim, é claro que o Solaris faz isso "corretamente" :-) Obrigado pela atualização ...
Murray Jensen
1

Você pode obter o que procura export:

export | grep HOME

Irá mostrar o conteúdo da $HOMEvariável.

Darth Egregious
fonte
1

se você precisar definir vários vars:

  ( set -o posix ; set ) | sort >~/vars.before

depois de defini-los:

  ( set -o posix ; set ) | sort >~/vars.after

do que exibir o que foi definido:

  comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'

Dessa forma, você se encontrará em breve, trabalhando com vários conjuntos de shell vars predefinidos em arquivos cnf, que combinados com o tmux, farão com que você seja o mestre do gerenciamento de configurações em ambientes shell:

  # ---------------------------------------------------------
  # cat cnf/qto.dev.host-name.cnf
  # [MainSection]
  # postgres_db_name     = dev_qto
  # postgres_db_host     = host-name
  #
  # call by: doParseCnfEnvVars cnf/qto.dev.host-name.cnf
  # ---------------------------------------------------------
  doParseCnfEnvVars(){

     cnf_file=$1;shift 1;
     test -z "$cnf_file" && echo " you should set the cnf_file !!!"

     INI_SECTION=MainSection

     ( set -o posix ; set ) | sort >~/vars.before

     eval `sed -e 's/[[:space:]]*\=[[:space:]]*/=/g' \
        -e 's/#.*$//' \
        -e 's/[[:space:]]*$//' \
        -e 's/^[[:space:]]*//' \
        -e "s/^\(.*\)=\([^\"']*\)$/export \1=\"\2\"/" \
        < $cnf_file \
        | sed -n -e "/^\[$INI_SECTION\]/,/^\s*\[/{/^[^#].*\=.*/p;}"`

     # and post-register for nice logging
     ( set -o posix ; set ) | sort >~/vars.after

     echo "INFO added the following vars from section: [$INI_SECTION]"
     comm -3 ~/vars.before ~/vars.after | perl -ne 's#\s+##g;print "\n $_ "'
  }
Yordan Georgiev
fonte