私は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
ソースコードを取得できます。~/.zshenv
zsh
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
しません。