O Kubuntu 14.10, .zshenv é originado duas vezes

1

Eu adicionei alguns diretórios na variável $PATH no meu arquivo ~/.zshenv conf. Após a reinicialização, notei que esses caminhos aparecem duas vezes. Tentei imprimir pilhas de chamadas e recebi o seguinte:

.zshenv sourced by
18385:/bin/zsh /etc/kde4/kdm/Xsession /usr/bin/startkde
 2158:  -:0
 1438:    kdm
    1:      /sbin/init

.zshenv sourced by
22143:/bin/zsh
20858:  /usr/bin/yakuake -session 10d5e3636b000141388223100000058160027_1415750006_832059
18385:    upstart --user
 2158:      -:0
 1438:        kdm
    1:          /sbin/init

Então, o segundo é ok, já que foi causado pela abertura do yakuake, onde eu estava verificando a variável $PATH . Mas a primeira ligação não está clara para mim. Por que o /etc/kde4/kdm/Xsession tenta carregar a configuração do usuário? Qual é o motivo e qual é a melhor maneira de evitar a duplicação $PATH ?

Por favor, não sugerir soluções alternativas como agrupar o conteúdo de .zshenv em verificações para a primeira execução (também conhecido como guardas)

    
por Grief 12.11.2014 / 20:42

1 resposta

0

Embora /etc/kde4/kdm/Xsession seja usado para carregar algumas das configurações de shell do usuário, ele não carrega ~/.zshenv explicitamente (embora um comentário mencione que está carregado). ~/.zshenv (assim como /etc/zshenv ) são carregados automaticamente toda vez que um zsh é iniciado, isso não pode ser substituído. E como /etc/kde4/kdm/Xsession é executado com seu shell de login - no seu caso zsh - ~/.zshenv também é carregado, não importa o que realmente seja feito em /etc/kde4/kdm/Xsession .

E /etc/kde4/kdm/Xsession tenta carregar a configuração do usuário para que ele esteja disponível para programas que são iniciados por outros meios além do shell da linha de comando (menu KDE, início automático, ícone da área de trabalho, etc.).

Como para evitar a duplicação de $PATH , isso deve funcionar: Em vez de usar algo como PATH=$PATH:/usr/local/bin:/my/path/here:/another/path , use

new_paths=(/usr/local/bin /my/path/here /another/path)
path=($path ${new_path:|path})

new_path é uma matriz dos caminhos que você deseja adicionar. path é a versão da matriz de PATH , tem o mesmo conteúdo, mas como matriz real, em vez da lista separada por dois-pontos. ${new_path:|path} é substituído por uma matriz dos elementos em new_path que ainda não estão em path .

    
por Adaephon 13.11.2014 / 14:45