Closed7

SSHログインした時に.zshenvが読み込まれない!?

NXVZBGBFBENNXVZBGBFBEN

あの,なんか$PATHおかしくないですか

SSHでコンテナに接続しようとしたらstarshipが見当たらねえぞって怒られた.

> ssh nxvzbgbfben@localhost -p 2222 -i ~/.ssh/dev-env
The authenticity of host '[localhost]:2222 ([::1]:2222)' can't be established.
ED25519 key fingerprint is SHA256:3FciZADyl5QDzoxeMFFcIlyYvyFoksx0Js4qwf3J3ZY.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:2222' (ED25519) to the list of known hosts.
/home/nxvzbgbfben/.local/etc/zsh/.zshrc:53: command not found: starship
dev-env-gentoo%

.zshenvではshell共通の設定を別の場所から読み込むようにしている.

.zshenv
source $HOME/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh

export ZDOTDIR=$XDG_CONFIG_HOME/zsh
set_environment_variables.sh
export XDG_DATA_HOME="$HOME/.local/share"
export XDG_CONFIG_HOME="$HOME/.local/etc"
export XDG_STATE_HOME="$HOME/.local/var/lib"
export XDG_CACHE_HOME="$HOME/.local/var/cache"

export BIN_HOME="$HOME/.local/bin"  # starshipはここにいる
export OPT_HOME="$HOME/.local/opt"

export CARGO_HOME="$OPT_HOME/cargo"
export PNPM_HOME="$XDG_DATA_HOME/pnpm"
export RUSTUP_HOME="$OPT_HOME/rustup"
export WASMTIME_HOME="$OPT_HOME/wasmtime"

export BIN_HOME="$CARGO_HOME/bin:$WASMTIME_HOME/bin:$BIN_HOME"
export PATH="$PNPM_HOME:$BIN_HOME:$PATH"

docker execで入った場合はちゃんとstarshipが読み込まれている...

> docker compose exec --user nxvzbgbfben gentoo zsh

~
⬢ [Docker] > whereis starship
starship: /home/nxvzbgbfben/.local/bin/starship
NXVZBGBFBENNXVZBGBFBEN

ログインシェルとインタラクティブシェル

zshの設定ファイルの読み込み順序は下の記事が詳しい.
https://qiita.com/muran001/items/7b104d33f5ea3f75353f

少なくとも.zshenvは絶対に読み込まれるはず.

docker execを実行した場合はインタラクティブシェルとして,sshを実行した場合はログインシェルとして起動しているようなので,それぞれの場合において起動時に何が読み込まれているのかを調べてみる.

NXVZBGBFBENNXVZBGBFBEN

SOURCE_TRACE

とりあえずdocker execを実行してコンテナに入り,その中でzshを起動してみる.

インタラクティブシェルとして起動

> docker compose exec --user nxvzbgbfben gentoo zsh

~
⬢ [Docker] > zsh -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>

ログインシェルとして起動

> docker compose exec --user nxvzbgbfben gentoo zsh

~
⬢ [Docker] > zsh --login -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/etc/zsh/zprofile:1> <sourcetrace>
+/etc/profile.env:1> <sourcetrace>
+/etc/profile.d/gawk.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
/home/nxvzbgbfben/.local/etc/zsh/.zshrc:53: command not found: starship
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>

ふむ,どちらの場合も.zshenvは読み込まれている...
つまり,.zshenvが読み込まれてから.zshrcが読み込まれるまでの間に$PATHが上書きされているのか.

NXVZBGBFBENNXVZBGBFBEN

/etc/profile.envって誰

なんとなく怪しいのは/etc/profile.envだな.
/etc/profile.envenv-updateがGentooのシステムで定義された環境変数を結合して格納する場所のようだ.
https://wiki.gentoo.org/wiki/Handbook:PPC/Working/EnvVar/ja#env-update

中身を見てみよう.

/etc/profile.env
# THIS FILE IS AUTOMATICALLY GENERATED BY env-update.
# DO NOT EDIT THIS FILE. CHANGES TO STARTUP PROFILES
# GO INTO /etc/profile NOT /etc/profile.env

export CONFIG_PROTECT='/usr/share/gnupg/qualified.txt'
export CONFIG_PROTECT_MASK='/etc/sandbox.d /etc/gentoo-release /etc/ca-certificates.conf /etc/revdep-rebuild'
export GCC_SPECS=''
export INFOPATH='/usr/share/gcc-data/x86_64-pc-linux-gnu/13/info:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.42/info:/usr/share/autoconf-2.71/info:/usr/share/automake-1.16.5/info:/usr/share/info'
export LANG='en_US.UTF-8'
export LESS='-R -M --shift 5'
export LESSOPEN='|lesspipe %s'
export LEX='flex'
export MANPAGER='manpager'
export MANPATH='/usr/share/gcc-data/x86_64-pc-linux-gnu/13/man:/usr/share/binutils-data/x86_64-pc-linux-gnu/2.42/man:/usr/local/share/man:/usr/share/man:/usr/lib/rust/man'
export PATH='/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin'
export ROOTPATH='/usr/local/sbin:/usr/local/bin:/usr/bin:/opt/bin'

ああ,$PATHがここで上書きされている...

NXVZBGBFBENNXVZBGBFBEN

とりあえず解決

それじゃあ/etc/profile.env以降で読まれるはずの.zprofileで環境変数の宣言をすればいいのか.

.zprofile
source $HOME/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh

ちゃんと読み込まれるのか調べてみる.

> docker compose exec --user nxvzbgbfben gentoo zsh

~
⬢ [Docker] > zsh --login -o SOURCE_TRACE
+/home/nxvzbgbfben/.local/etc/zsh/.zshenv:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/etc/zsh/zprofile:1> <sourcetrace>
+/etc/profile.env:1> <sourcetrace>
+/etc/profile.d/gawk.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zprofile:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/nxvzbgbfben/shell/set_environment_variables.sh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zshrc:1> <sourcetrace>
+/home/nxvzbgbfben/.local/opt/fzf/shell/completion.zsh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/opt/fzf/shell/key-bindings.zsh:1> <sourcetrace>
+/home/nxvzbgbfben/.local/etc/zsh/.zcompdump:1> <sourcetrace>

お,これなら大丈夫そうだ.
SSHで再度接続してみる.

> ssh nxvzbgbfben@localhost -p 2222 -i ~/.ssh/dev-env

nxvzbgbfben in [SSH] dev-env-gentoo in ~
⬢ [Docker] >

お,直った.
だいぶ雑な直し方だけど,とりあえず解決した.

おわり

このスクラップは3ヶ月前にクローズされました