Por que o subshell não herda a variável exportada (PS1)?

3

Estou usando startx para iniciar o ambiente gráfico. Eu tenho um .xinitrc muito simples, ao qual adicionarei coisas enquanto configuro o ambiente, mas, por enquanto, é o seguinte:

catwm & # Just a basic window manager, for testing.

xterm

A razão pela qual eu faço o background do WM e terminal de primeiro plano e não o contrário, é porque gostaria de poder voltar ao console de texto virtual depois de digitar exit in xterm . Isto parece funcionar como descrito.

O problema é que a variável PS1 que atualmente está configurada para minha preferência em /etc/profile.d/user.sh (que é originada de /etc/profile fornecida pela distro), não parece se propagar para o ambiente do xterm mencionado acima. A árvore de processos relevante é a seguinte:

\_ -bash
    \_ xinit /home/user/.xinitrc -- /etc/X11/xinit/xserverrc :0 -auth /tmp/serverauth.ggJna3I0vx
        \_ /usr/bin/X -nolisten tcp :0 -auth /tmp/serverauth.ggJna3I0vx vt1
        \_ sh /home/user/.xinitrc
            \_ /home/user/catwm
            \_ xterm
                \_ bash

O shell iniciado por xterm parece ser interativo, o shell executando .xinitrc , no entanto, não é. Eu estou bem com ambos, as suposições sobre interatividade parecem ser perfeitamente válidas, mas agora eu tenho um shell não interativo que gera um shell interativo indiretamente, e o shell interativo não tem chance de herdar automaticamente o prompt, porque o prompt não foi definido ou de outra forma, ficar indisponível acima da árvore de processos. Como faço para obter meu aviso de volta?

    
por amn 21.10.2013 / 11:51

1 resposta

3

Os comandos env e export listam apenas variáveis que são exportadas. $PS1 geralmente não é exportado. Experimente echo $PS1 no seu shell para ver o valor real de $PS1 .

Os shells não interativos geralmente não têm $PS1 . Non-interactive bash explicitamente não recupera $PS1 . 1 Você pode verificar se bash é interativo por echo $- . Se a saída contiver i , ela será interativa. Você pode iniciar explicitamente o shell interativo usando a opção na linha de comando: bash -i . O shell iniciado com -c não é interativo.

O /etc/profile script é lido para um shell de login. Você pode iniciar o shell como um shell de login por: bash -l .

Com bash shell, os scripts /etc/bash.bashrc e ~/.bashrc geralmente são usados para definir $PS1 . Esses scripts são originados quando o shell interativo de não-login é iniciado. Este é o seu caso no xterm . Veja Definindo o PS? Strings permanentemente

Soluções possíveis

  • Inicie o shell dentro de xterm como um shell de login : bash -l . Verifique se /etc/profile e ~/.profile não contêm código que deve ser executado somente após o login. Talvez pequenas modificações dos scripts sejam necessárias.
  • Use um shell diferente. Por exemplo, dash não desabilita $PS1 . Você pode usar um shell desse tipo, da mesma forma que o shell não interativo, que executará os scripts até xterm .
  • Desista da estrita conformidade com POSIX e use o local padrão da bash para definir $PS1 : /etc/bash.bashrc ou ~/.bashrc .
  • Desista da conformidade estrita do POSIX e crie seu próprio script de inicialização como: bash --rcfile <(echo "PS1=$PS1save") -i
  • Inicie os shells intermediários de startx até xterm como shells interativos ( bash -i ). Infelizmente isso pode ter algum efeito colateral e eu não faria isso.
por 21.10.2013 / 13:19