web-dev-qa-db-ja.com

新しいtmuxセッションは.zshrcのみをソースとし、.profileで定義された$ PATHを取得しません

このトピックに関する複数の質問を読んだ後、私はまだ迷っています。特に$PATHまたは.profileではなく.bashrc.zshrcを含む環境変数を設定する必要があるという提案を読んだので、これを行いました。

デフォルトのシェルはzshで、set-option -g default-Shell $Shelltmux.confを設定しました。

ただし、tmuxセッションを起動すると、$PATHへの変更が反映されず、.zshrcのみがソースに含まれるようになりました。私の現在の回避策は、source ~/.profileの最後に.zshrcを追加することですが、これは正しいことだとは思いません。

この投稿 は、通常、tmux/screenがログインシェルではなくサブシェルとして実行されるため、必ずしも.profileをソースにする必要はないことを示しています。しかし、別の投稿では、シェルでlogoutを実行できる場合、それはログインシェルであり、私が実際に実行できたと主張しています。多くの投稿では、tmux.bash_profileplus.profileを探す必要があると主張しましたが、.bashrc、これは明らかに私のzsh同等の場合に起こったことではありません。

結局、tmshをzshで使用して、環境変数を適切に取得するためのベストプラクティスは何ですか?

2
xji

あなたが説明する動作は期待されるものです。環境変数は、ログイン時に読み取られる_.profile_で定義されています。新しいtmuxセッションを開始してもログインしません。TMuxはデフォルトでログインシェルを開始しますが、設定でこれをオフにしています。したがって、tmuxウィンドウは外部環境を継承します。

_source .profile_を_.zshrc_に入れると、シェルが実行されている環境がすべて上書きされます。つまり、デフォルト環境とは異なる環境でシェルを実行することはできません。別のPATHを試してみてください。

_source .profile_から_.zshrc_を削除するだけです。すべてのシェルで、デフォルトの環境がログイン時に設定されます。

ログインシェルがzshの場合、ログイン時に_.zprofile_ではなく_.profile_を読み取ることに注意してください。これは、_.profile_がない場合に_.bash_profile_を読み取るbashとは異なります。 Zshは、構文がshと異なるため、動作が異なります。したがって、_.profile_を直接読み取ることはできません。 GUIログイン用にshで機能する_.profile_を使用し、テキストモードログインにも同じファイルを使用する場合、zshをログインシェルとして設定し、次の行を_~/.zprofile_:

_emulate sh -c 'source ~/.profile'
_

ログインシェルを実行するようにtmuxが構成されている場合、すべてのtmuxウィンドウは、環境を継承するのではなく、周囲の環境をオーバーライドします。つまり、tmuxの外部で新しい変数を定義しても、それらはtmuxセッションに残りますが、すでに定義されている変数の値を変更すると、変更はtmux内で失われます。全体として、tmuxのデフォルトの動作はあまり意味がありません。これを回避するのが_set-option -g default-command $Shell_の_~/.tmux.conf_行のポイントです。

「新規ログイン」を行う方法としてtmuxを使用する場合、各ウィンドウを新規環境で実行することをお勧めします。もしそうなら、あなたはおそらく次のようなもので環境をクリーンアップする必要があります

_set-option -g default-command env -i USER="$USER" LOGNAME="$LOGNAME" $Shell
_

また、ログインシェルがzshの場合、_.zprofile_ではなく_.profile_を読み取ります。

set-option -g default-Shell $Shellから.tmux.confを削除する必要があります。 tmuxはデフォルトでShell envvarを使用するため、必要ありません。

これはマンページが言うことです:

     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は、デフォルトでログインシェル(つまり、終了する前に~/.profileまたは~/.zprofileおよび~/.zlogoutまたは~/.bash_logoutを取得するシェル)を開始します。

     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.

この動作についての議論は here を参照してください-これは非常に驚くべきことであり、screenの動作とは異なります。

したがって、tmuxでデフォルトのシェルを使用してnonログインシェルを開始する場合は、~/.tmux.confに次のように入力します。

set -g default-command $Shell

デフォルトのシェルとは別のシェルでログインシェルを実行する場合:

set -g default-command "/alternative/sh -l"
1
mosvy