tela e variáveis de ambiente
Por padrão, a tela passa para seus shells (e outros processos) quaisquer variáveis de ambiente que tivessem quando a sessão foi iniciada (ou seja, a reconexão não altera quais variáveis de ambiente são dadas a novos shells). Mas como os arquivos de configuração screen e shells 'normalmente alteram as variáveis de ambiente, há muitos lugares onde alterações inesperadas podem ser introduzidas. Existem algumas variáveis, como TERM , que a tela quase sempre muda, mas estas geralmente são necessárias para a funcionalidade que a tela oferece. / p>
Digamos que nem a configuração do seu shell, nem a configuração do screen irá modificar uma variável chamada FOOBAR (bastante provável, apesar de tudo). Se você iniciar uma sessão com FOOBAR=foo screen
, todos os shells criados nessa sessão terão uma variável de ambiente chamada FOOBAR com um valor de foo
.
As coisas ficam mais complicadas para variáveis que exibem ou que seu shell pode modificar.
Configurações ausentes ao usar a tela
Shells de Login
Se você achar que algumas configurações estão faltando em shells iniciadas por screen , pode ser porque seu shell está configurado apenas para atualizar essas configurações para shells de "login". A maioria dos shells entendem uma convenção especial (em C: **argv == '-'
) que a tela pode ser configurada para usar.
Na documentação tela :
shell command
Set the command to be used to create a new shell. This overrides the value of the environment variable $SHELL. This is useful if you'd like to run a tty-enhancer which is expecting to execute the program speci- fied in $SHELL. If the command begins with a '-' character, the shell will be started as a login-shell.
Para que tela inicie os shells como 'login', inicie tela com screen -s -/bin/bash
ou adicione esta linha ao seu .screenrc
:
shell -/bin/bash
Ajuste o caminho para qualquer shell que você esteja usando.
tela Configuração
As variáveis de ambiente em falta ou reconfiguradas também podem ser causadas pelos comandos setenv
e unsetenv
em um arquivo de configuração tela . Você terá que verificar tanto o .screenrc em seu diretório home e o arquivo que sua compilação de tela está usando como o 'system screenrc' (você pode tentar um comando como strings "$(which screen)" | fgrep -i screenrc
para encontrar o nome de caminho que foi configurado em tempo de compilação - geralmente é / etc / screenrc para uma tela instalada pelo sistema ; instalações adicionais provavelmente usarão outras nome do caminho). Você pode usar SCREENRC=/dev/null SYSSCREENRC=/dev/null screen
para evitar temporariamente esses arquivos de configurações, mas existe uma opção de tempo de compilação que impede o uso efetivo de SYSSCREENRC (presumivelmente para que os administradores do sistema possam forçar um pouco da configuração inicial).
Configurações duplicadas ao usar a tela
É bastante comum adicionar itens a uma variável de ambiente como PATH no (s) arquivo (s) de configuração de um shell para que o valor atualizado esteja disponível para sessões normais do shell (por exemplo xterm ou outras janelas de terminal, sessões de console, etc.). Se tais itens forem adicionados na configuração por shell de um shell (ou, se você estiver usando a configuração -/path/to/shell
descrita acima, na configuração shells per-login), então o shell iniciado por screen provavelmente ter várias cópias dos itens adicionados.
Uma estratégia para evitar isso é colocar todas as adições em variáveis como PATH na configuração por-login do seu shell e evitar usar a configuração -/path/to/shell
shell com tela .
Outra estratégia é apenas adicionar condicionalmente os novos itens à variável. Dependendo do shell, o código para fazer isso pode ser um pouco complicado, mas geralmente pode ser encapsulado em uma função de shell para facilitar o uso.
Ainda outra estratégia é sempre começar com um valor fixo em seus arquivos de configuração. Isso às vezes pode causar problemas ao mover seus arquivos de configuração de sistema para sistema quando os valores padrão podem variar significativamente.
Diagnóstico
Se você não puder identificar diretamente onde uma modificação específica está acontecendo, tente o seguinte para rastrear onde a alteração está acontecendo.
Verifique o valor atual no seu shell inicial:
echo "$PATH"
Verifique como o próprio shell modifica o valor quando um sub-shell é criado:
/bin/bash -c 'echo "$PATH"'
Verifique como o shell modifica o valor quando um sub-shell de "login" é criado:
perl -e '$s=shift;exec {$s} "-$s", @ARGV or die "unable to start shell"' /bin/bash
echo "$PATH"
exit
Verifique como tela modifica o valor:
printf '#!/bin/sh\nl=/tmp/echo-var.log;rm -f "$l"; echo $PATH >"$l"' >/tmp/echo-var &&
chmod a+x /tmp/echo-var &&
screen -s /tmp/echo-var &&
cat /tmp/echo-var.log