私のログインシェルがzshですが、lightdmが私の.profileをインポートするのはなぜですか?

私のログインシェルがzshですが、lightdmが私の.profileをインポートするのはなぜですか?

私はLinux Mint 19.2 Cinnamonを使用しており、ZSHをユーザーのログインシェルとして使用しています。

ログインすると、すべてのZSH起動スクリプトで一度だけ指定されたにもかかわらず、私のエントリは2回含まれているとマークされます$PATH$HOME/.local/bin$HOME/.zshenv

他のドットファイルを調べたところ、以下$HOMEに問題のある修正が見つかりました。$PATH$HOME/.profile

# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/.local/bin" ] ; then
    PATH="$HOME/.local/bin:$PATH"
fi

これはZSHのドキュメントにorで.profile呼び出されたときにのみsh「互換性」モードに切り替わると言われているので、これは驚くべきことです。ksh

Zshがそれぞれshまたはkshとして呼び出されると、shまたはkshをより正確にエミュレートしようとします。最初の「r」を除いて、呼び出された名前の最初の文字を確認します(「restricted」を表すと仮定)。 )、"b"、"s"、または"k"の場合、shまたはkshをエミュレートします。また、suとして呼び出されると(一部のシステムでsuコマンドを介してシェルを実行したときに発生します)、シェルはSHELL環境変数で代替名を見つけ、その名前に基づいて偽装を実行します。

.profile最後に次の行を追加してソースを確認しました。

logger "Opened .profile with this shell: $SHELL"
PARENT_COMMAND=$(ps -o args= $PPID)
logger "Parent command: $PARENT_COMMAND"

ログアウトして再度ログインすると、システムログに次の内容が含まれます。

Opened .profile with this shell: /usr/bin/zsh
Parent command: lightdm --session-child 13 20

私がZSHであっても、ディスプレイマネージャにlightdmソースタスクを実行させる一連のイベントは何ですか?その理由は何ですか?.profile$SHELL

答え1

~からArch-Linux Wikiページlightdm(私の考えでは、これはLinux Mintの状況にも当てはまるかもしれません):

から移行すると、xinitシェルで表示が開始されないことがわかります。これは、ディスプレイを起動するシェルとは異なり(ディスプレイはシェルの環境を継承します)、LightDMはディスプレイを起動してシェルをインポートしないためです。 LightDM はラッパースクリプトを実行して表示を開始し、最後にグラフィカル環境を実行します。デフォルトで/etc/lightdm/Xsessions.conf実行します。

環境変数

スクリプトは、、、/etc/profileおよび~/.profile/etc/xprofile順番に確認します。~/.xprofile使用しているシェルがこれらのファイルを提供していない場合は、~/.xprofileこれを行うためのシェルを作成できます。 (この場合、ログインシェルはzsh

~/.xprofile


#!/bin/sh
[[ -f ~/.config/zsh/.zshenv ]] && source ~/.config/zsh/.zshenv

そのため、ラッパースクリプトの起動時に実行する操作な~/.profileので、ファイルソースをインポートしてください。lightdmウィキテキストには別のものがありますzshユーザーの具体例これには、~/.zshenvあなたの製品をから調達することが含まれます~/.xprofile

例の -line はファイルが#!ソースとして提供されているため、必要ないので意味がなく、優先順位を付ける方が合理的であるため、構文解析の順序が正しく得られたかどうか疑問に思います(~/.xprofileつまり~/.profile~/.profileまったく読まないでください。存在します~/.xprofile)。

このウィキの提案がうまくいかない場合は、読み込み中に次のように~/.profileソースコードを取得できます。~/.zshenvzsh

case $SHELL in (*/zsh) . "${ZDOTDIR:-$HOME}/.zshenv"; return ;; esac

または

if [ "$SHELL" = "/usr/bin/zsh" ]; then
    . "${ZDOTDIR:-$HOME}/.zshenv"
    return
fi

その上に。

答え2

誰かに役立つ場合:ソースzshenv.xsessionrc。明らかにによって実行されるので、/bin/shコマンドは次のようになります。dash(POSIX)規格:

if test "${SHELL##*/}" = "zsh" ; then
  # shellcheck disable=SC1091
  test -r /etc/zsh/zshenv && . /etc/zsh/zshenv
fi

特に[[ ... ]]動作sourceしません。

関連情報