Qual é o escopo de “exportado” nas variáveis shell do Unix?

4

Eu configurei algumas variáveis de ambiente da seguinte maneira:

MY_VAR='helloworld'
export MY_VAR

Então mudei para outro usuário via

su SOME_OTHER_USER

Eu echo a variável MY_VAR ... e vejo seu valor!

1) Por favor, você poderia explicar essa questão? Tanto quanto eu entendo quando eu exportar variável via comando de exportação não é uma exportação "global", é apenas uma variável de usuário local. Por que eu vejo isso?

2) Inicialmente eu tinha um palpite: pode ser, quando mudo para outro usuário eu inicio algum processo filho do meu processo bash, e é por isso que consigo ver minha variável porque os vars exportados são passados para qualquer processo filho de corrente Concha. Mas o comando ps ---pid <my bash's pid which I got with echo $$> mostra apenas o mesmo pid na saída. Então, parece que isso significa que não há processos filhos relacionados ao meu processo bash e que o su não está iniciando nenhum processo. Estou certo? (a propósito, eu não vejo um único 'filho' desse jeito, mesmo se eu começar outro bash com o comando bash, eu não sei porque)

3) Finalmente, quem pode ver a variável que eu exportei dessa maneira? Tendo em conta que inicio algum outro processo a partir do meu OS GUI - estou prestes a ver isso? Parece que não, porque se eu começar outro terminal eu não vejo isso lá. Então, qual é o escopo e a vida útil da minha variável exportada?

Eu uso o Debian Wheezy. Eu estava executando meu comando do RootTerminal sob o usuário root.

    
por MiamiBeach 22.03.2015 / 09:36

2 respostas

3
  • OK, para começar, acho que você quer dizer ps --pid e não ps ---pid .
  • Você não precisa echo $$ e digite o número em ps --pid number ; é bom o suficiente para digitar ps --pid $$ . A menos que você esteja falando sobre

    # echo $$
    42
    # su joe
    % ps --pid 42
    

    em qual caso você está fazendo a coisa certa.

  • O que você estava esperando?

    --pid pidlist

      Select by process ID.  Identical to -p and p.


    -p pidlist

      Select by PID.  This selects the processes whose process ID numbers appear in pidlist.  Identical to p and --pid.

    Então, quando você faz ps --pid PID_of_shell , você está recebendo a linha de saída de ps somente para o processo de shell . Você pode achar ps -l | grep PID_of_shell mais útil; mostrará qualquer linha que contenha PID_of_shell em qualquer lugar, incluindo na coluna PPID. Ou seja, ele mostrará os processos filhos do shell. Mas, é claro, grep 42 encontrará coisas como 7428 .

  • Seu palpite está certo; variáveis de ambiente são passadas de pai para filho. Como indicado acima, seu shell su é filho do seu shell de login (ou outro shell pai). Observe, no entanto, que um processo pode alterar seu ambiente; sudo é um pouco notório por fazer isso, e su também (por exemplo, ele altera $USER , $LOGNAME e $HOME a menos que você especifique --preserve-environment , e ainda mais se você especificar --login ). Além disso, um processo pode transmitir a seus filhos um ambiente diferente do que aquele que está usando; a casca faz isso quando você diz algo como %código%. Referências: 1 , 2 .
  • Portanto, não, se você definir (exportar) uma variável de ambiente no shell em um terminal, e depois iniciar outro terminal através do gerenciador de janelas, ele não verá a variável de ambiente, porque não é uma criança (ou descendentes) do shell que o configurou. Mas, se você iniciar uma nova janela de terminal a partir do shell (por exemplo, por PAGER=cat man man_page_topic ), então essa janela de terminal herdará o ambiente do shell.
por 22.03.2015 / 11:47
0

Pode ser mais fácil entender se você estava acessando a máquina com ssh, rlogin ou telnet, mesmo como o mesmo usuário. (rlogin / telent não são recomendados)

Se você definir e exportar uma variável de tty1 como usuário foo, qualquer processo filho poderá ver a variável e seu valor. Mas se você começar uma nova sessão, ie. de tty2, como usuário foo, a variável não será visível.

1) Quando você exporta uma variável, você a torna global (no contexto da sessão). Como uma nota lateral, eu desencorajo strongmente o uso de trabalhar em um shell "raiz". Erros e acidentes são muito menos tolerantes quando executados por este usuário / conta.

2) O comando su é um utilitário de usuário definido (ou alternado). Você ainda está na sua sessão original. É por isso que você ainda pode ver sua variável exportada.

3) O escopo é a sessão atual e o tempo de vida é a duração dessa sessão (até que você efetue logout, supondo que você não redefina ou altere a variável novamente). Se você gerar novos xterms da sessão pai, os filhos ainda verão sua variável exportada. Se você iniciar novas sessões / terminais, as variáveis e seus valores dos outros tty (s) não serão visíveis.

    
por 06.08.2017 / 22:33