Você pode executar screen -S foo -X setenv DISPLAY "$DISPLAY"; screen -S foo -rd
para alterar o ambiente do processo screen
antes de anexar. Isso não afetará as janelas existentes.
Talvez você possa configurar o seu shell para verificar se há DISPLAY
(e qualquer outra variável relevante, como XAUTHORITY
) atualizada toda vez que exibem um prompt. (Isso significa que você pode ter que pressionar Enter uma vez se o shell estiver em um prompt quando você anexou a sessão.) O Bash avalia $PROMPT_COMMAND
antes de exibir cada prompt. Zsh executa a função precmd
antes de exibir cada prompt. Por exemplo, se você tiver colocado as atribuições de ambiente desejadas em um script ~/var/run/screen-12345.foo.env-update.sh
(onde 12345 é o pid do processo de tela e foo
é o nome da sessão), você pode usar algo como (para zsh, não testado; não pense que você conseguirá sair sem bifurcação):
precmd () {
local now=$SECONDS
set ~/var/run/"screen-$STY.env-update.sh"(Nms-$(($now-$screen_env_time)))
if [[ $# -ne 0 ]]; then
screen_env_time=$now
. ~/var/run/"screen-$STY.env-update.sh"
fi
}
Outra coisa que você poderia fazer de $PROMPT_COMMAND
ou precmd
, em alguns sistemas operacionais, é ler o ambiente do processo pai (isso pressupõe que você atualizou o ambiente do processo de tela). Por exemplo, no Linux com zsh (faça isso apenas se estiver executando na tela):
precmd () {
local record
while read -r -d $'precmd () {
local now=$SECONDS
set ~/var/run/"screen-$STY.env-update.sh"(Nms-$(($now-$screen_env_time)))
if [[ $# -ne 0 ]]; then
screen_env_time=$now
. ~/var/run/"screen-$STY.env-update.sh"
fi
}
' record /proc/$PPID/environ; do
case ${record%%=*} in
DISPLAY|XAUHORITY) export $record;;
esac
done
}
Tecnicamente, você pode alterar o ambiente de outro processo, usando um depurador. Mas há uma boa chance de que o processo seja travado, porque as estruturas de dados internas do programa não corresponderão aos dados mantidos pelo kernel.
Note que nenhuma dessas soluções fará bem se você executar o ssh dentro de uma janela de tela.