PS1
環境変数内でシェル関数を呼び出しているような場合、別のシェルを起動すると関数は引き継がれずに環境変数だけ引き継がれてしまってエラーが出ることがあります。たとえば私は普段zshを使っているのですが、shを明示的に起動すると下記のような状況になります。
› sh
sh: git_info_for_prompt: command not found
%3~%#
普段はshとか起動しないからいいかなと思ってたんですが、EmacsでTRAMPを使っていると内部的にshを起動していて死ぬことに気付きました。類似の状況は他にもあるのではないでしょうか。
ENV環境変数を利用する
上記の状況に対応する方法は2種類考えられます。
-
PS1
をどの環境でも動くような値に変更する - 別のシェル起動時に無難な
PS1
をセットし直す
前者の方がキレイな気もしますが、自分用の設定ファイルでポータビリティの高い書き方を強要されるのも変な話です。そこで後者の方針で進めてみます。
たとえばbashであれば~/.bashrc
でbash用のPS1
を設定するようにすればzsh用のPS1
のせいでエラーが出ることはありません。しかし、素のshやshにリネームされたdashを起動した場合、自動的に読み込まれる設定ファイルというのが存在しません(ログイン時であれば~/.profile
が有効ですが、今回の状況ではログインシェルとは限らないため)。
そこで、ENV
環境変数をセットすることにします。この変数に初期化ファイルをセットしておくと、sh・dash・kshあたりが起動時に読み込んでくれるようです。
私は~/.profile
に次のように追記しました。
# すべてのシェル起動時に読まれるファイルを設定
# 複雑なPS1を設定している環境で/bin/shを直接起動された場合に対処するため
ENV=".shrc"; export ENV
また、~/.shrc
には次のように書きました。
PS1='$ '; export PS1
こうして無事平和が訪れました。
› sh
$
参考URL
ENV
環境変数はググラビリティが低すぎて1次情報がどこなのか全然わかりませんでした…。