Atualizando as variáveis de ambiente de sessão da tela para refletir um novo login gráfico?

18

Eu uso linux, e gosto de fazer todo o meu trabalho de linha de comando em uma única sessão de tela, para que eu possa reiniciar meu login gráfico e tal sem perder meus terminais. No entanto, quando faço logout e retorno à minha sessão gráfica, isso altera todas as variáveis de ambiente da minha sessão, como as sessões do DBus. Isso significa que, após o login novamente, minha sessão de tela agora tem as variáveis de ambiente antigas (e erradas). Então agora, quando eu tento iniciar programas gráficos da minha sessão de tela, na melhor das hipóteses eles emitem um aviso sobre não conseguir se conectar ao barramento de sessão. Na pior das hipóteses, eles não conseguem começar completamente.

Então, o que estou procurando é uma maneira de modificar variáveis de ambiente em uma instância de tela em execução, para que todas as janelas de tela criadas subseqüentemente herdem as novas variáveis de ambiente. Existe uma maneira de fazer isso?

    
por Ryan Thompson 07.02.2010 / 22:14

3 respostas

2

Eu implementei um script para fazer isso. Você pode obtê-lo aqui: link

Depois de colocar screen-sendenv.py no seu $PATH , você pode usar o seguinte snippet no seu .bashrc:

VARS_TO_UPDATE="DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO"
screen_pushenv () {
  screen-sendenv.py -t screen $VARS_TO_UPDATE
}
tmux_pushenv () {
  screen-sendenv.py -t tmux $VARS_TO_UPDATE
}
screen_pullenv () {
  tempfile=$(mktemp -q) && {
    for var in $VARS_TO_UPDATE; do
      screen sh -c "echo export $var=\$$var >> \"$tempfile\""
    done
    . "$tempfile"
    rm -f "$tempfile"
  }
}
tmux_pullenv () {
  for var in $VARS_TO_UPDATE; do
    expr="$(tmux showenv | grep "^$var=")"
    if [ -n "$expr" ]; then
      export "$expr"
    fi
  done
}

Para usá-lo, basta executar screen_pushenv antes de executar screen -r para reconectar a sua sessão de tela. Em seguida, após anexar com screen -r , você poderá atualizar o ambiente em seus shells existentes com screen_pullenv . As funções tmux realizam o mesmo para o tmux, outro multiplexador de terminais similar ao screen.

    
por 14.01.2012 / 02:55
8

Você não pode iniciar um script de shell a partir da sessão screen , pois herdaria o ambiente antigo. Você pode, no entanto, usar o fifo para obter as novas variáveis de ambiente na sessão da tela antiga. Você pode preencher esse fifo quando começar sua sessão gráfica.

#!/bin/bash
FIFO=/tmp/your_variables
[ -e $FIFO ] && cat $FIFO > /dev/null || mkfifo $FIFO

# save number of variables that follow
NVARS=2
echo $NVARS > $FIFO
echo ENV1=sth1 > $FIFO
echo ENV2=sth2 > $FIFO

Inicie o script em segundo plano no login (ele só terminará quando todas as variáveis forem lidas a partir dele).

Agora você pode ler a partir do fifo, por exemplo adicione esta função ao seu .bashrc

update_session() {
  FIFO=/tmp/your_variables

  NVAR=$(cat $FIFO)
  for i in $(seq $NVAR); do
    export $(cat $FIFO)
  done
  #delete the pipe, or it will not work next time 
  rm $FIFO
}

para que você possa em sua antiga screen session

update_session
    
por 07.02.2010 / 23:09
0

Esta é provavelmente uma solução mais simples (você decide). A parte importante é o alias que chama a função savedisplay sempre que o comando screen é executado. Os comandos não são executados automaticamente, portanto, podem ser colocados em ~/.bashrc em vez de algo muito especializado como ~/.ssh/rc .

savedisplay() {
    # Write latest bash display to a file, This is used to 
    # update running bash sessions for a "screen -r"
    echo "export DISPLAY=$DISPLAY" > ~/.XDISPLAY
    echo "export XAUTHORITY=$XAUTHORITY" >> ~/.XDISPLAY
    # This will only update the environment for new windows
    screen -X setenv DISPLAY $DISPLAY
    screen -X setenv XAUTHORITY $XAUTHORITY
}

# run this to update env variable in a running session
updatedisplay() {
    source ~/.XDISPLAY 
}

alias screen='savedisplay && screen'
    
por 16.04.2016 / 21:13