A nova sessão do tmux apenas fornece fontes .zshrc e não seleciona o $ PATH definido em .profile

2

Depois de ler várias perguntas sobre esse assunto, ainda me sinto perdido. Eu li sugestões de que se deve definir as variáveis de ambiente, incluindo $PATH em .profile em vez de especificamente em .bashrc ou .zshrc , e foi isso que eu fiz.

Meu shell padrão é zsh e eu defini set-option -g default-shell $SHELL em tmux.conf .

No entanto, agora, sempre que eu inicio as sessões do tmux, aparentemente ele não pega nenhuma modificação no $PATH e apenas nas fontes .zshrc . Minha solução atual é adicionar source ~/.profile no final de .zshrc , o que não acho que seja a coisa certa a fazer.

Esta postagem indica que o tmux / screen geralmente é executado como subshells ao invés de shells de login, e portanto não necessariamente fonte .profile . No entanto, outro post afirmou que, se você pode executar logout no shell, é um shell de login, o que eu era realmente capaz de fazer. Muitas postagens também afirmaram que tmux deve procurar .bash_profile mais .profile , mas ignoraria .bashrc , o que aparentemente não é o que aconteceu no meu caso do equivalente zsh.

Qual é a melhor prática para usar o tmux com o zsh e ter corretamente as variáveis de ambiente, afinal?

    
por xji 20.10.2018 / 09:34

2 respostas

3

O comportamento que você descreve é o esperado. As variáveis de ambiente são definidas em .profile , que é lido quando você efetua login. Iniciar uma nova sessão do tmux não faz o seu login. O Tmux inicia um shell de login por padrão, mas você desativou isso na configuração, portanto, As janelas tmux apenas herdam o ambiente externo.

Se você colocar source .profile no seu .zshrc , isso substituirá qualquer ambiente em que o shell estiver sendo executado. Isso significa que você não pode executar um shell em um ambiente diferente do padrão, por exemplo, para tentar algo com um diferente PATH .

Basta remover source .profile de .zshrc . Você terá seu ambiente padrão, definido no tempo de login, em todos os shells.

Se o seu shell de login for zsh, observe que ele lê .zprofile no tempo de login, não .profile . Isso é diferente do bash, que lê .profile se não houver .bash_profile . O Zsh funciona de maneira diferente porque sua sintaxe é diferente de sh, portanto, ele não pode ler .profile diretamente. Se você quiser ter um .profile que trabalhe sob sh para logins GUI e também usar o mesmo arquivo para logins em modo texto, e você tiver zsh configurado como seu shell de login, use a seguinte linha como seu ~/.zprofile :

emulate sh -c 'source ~/.profile'

Se o tmux estiver configurado para executar um shell de login, todas as janelas do tmux substituirão o ambiente ao redor, em vez de herdá-lo. Isto significa que se você definir novas variáveis fora do tmux, você ainda as terá na sessão do tmux, mas se você alterar os valores das variáveis que já estão definidas então suas mudanças serão perdidas dentro do tmux. Tudo somado, o comportamento padrão do tmux não faz muito sentido. Evitar isso é o ponto da linha set-option -g default-command $SHELL em ~/.tmux.conf .

Se você usa o tmux como uma maneira de fazer um “login fresco”, você pode preferir que cada janela seja executada em um ambiente novo. Se assim for, então provavelmente você deve limpar seu ambiente com algo como

set-option -g default-command env -i USER="$USER" LOGNAME="$LOGNAME" $SHELL

E lembre-se de que, se o seu shell de login for zsh, ele lerá .zprofile , não .profile .

    
por 20.10.2018 / 09:39
1

Você deve remover seu set-option -g default-shell $SHELL de .tmux.conf ; não é necessário, porque tmux usará o SHELL envvar por padrão.

Isto é o que diz a manpage:

     default-shell path
             Specify the default shell.  This is used as the login
             shell for new windows when the default-command option is
             set to empty, and must be the full path of the exe-
             cutable.  When started tmux tries to set a default value
             from the first suitable of the SHELL environment vari-
             able, the shell returned by getpwuid(3), or /bin/sh.
             This option should be configured when tmux is used as a
             login shell.

tmux iniciará um shell de login (ou seja, um shell que está obtendo ~/.profile ou ~/.zprofile - e ~/.zlogout ou ~/.bash_logout antes de sair) por padrão:

     default-command shell-command
             Set the command used for new windows (if not specified
             when the window is created) to shell-command, which may
             be any sh(1) command.  The default is an empty string,
             which instructs tmux to create a login shell using the
             value of the default-shell option.

Veja aqui para uma discussão sobre este comportamento - - o que é bastante surpreendente e diferente do de screen .

Então, se você quiser que tmux inicie um shell não -login usando seu shell padrão, coloque o seguinte em seu ~/.tmux.conf :

set -g default-command $SHELL

e se você quiser que ele execute um shell de login com outro shell que não o padrão:

set -g default-command "/alternative/sh -l"
    
por 20.10.2018 / 09:57