問題
SSHコマンドを使って、リモートホストで直接コマンドを実行した場合、.zshrc
が読み込まれていませんでした。
PATH=/bin:$PATH
$ ssh example.com 'echo $PATH'
/usr/local/sbin:/usr/local/bin # ここに/bin が無い
調べたところSSHで繋いだ場合には login shell
と呼ばれる状態で起動しており、 login shell
は .zshrc
を読みに行きません。
調査方法
色々調べたところ .zprofile
に書くと良い、というのを見ましたが、書き込んでも変化はありませんでした。
下記にかなり詳細な読み込み順序が書かれていました。
この図によるとSSHで繋がれたシェルは「login shell」かつ「non interactive shell」で黄色い線のように見えるのですが、ワンライナーの場合にはどうやら違うらしく、青い線のようです。
そこで ~/.zshenv
に書き込みました。
PATH=/bin:$PATH
$ ssh example.com 'echo $PATH'
/bin:/usr/local/sbin:/usr/local/bin # /bin が出てきた
なお /etc/zprofile
のようなファイルが呼ばれるかどうかについてはインストール済みの環境で man zsh
して FILES を確認すると良いとのことでした。
確認すると実際には /etc/zprofile
ではなくもう一つ下の /etc/zsh/zprofile
下記はその例。
$ man zsh | grep -A20 FILES
FILES
$ZDOTDIR/.zshenv
$ZDOTDIR/.zprofile
$ZDOTDIR/.zshrc
$ZDOTDIR/.zlogin
$ZDOTDIR/.zlogout
${TMPPREFIX}* (default is /tmp/zsh*)
/etc/zsh/zshenv
/etc/zsh/zprofile
/etc/zsh/zshrc
/etc/zsh/zlogin
/etc/zsh/zlogout (installation-specific - /etc is the default)
解決方法
ということでSSHのワンライナーでも呼ばれる ~/.zshenv
に .zshrc
を呼ばれるように書いておきました。
if [ -f ~/.zshrc ]; then
. ~/.zshrc
fi
参考