LoginSignup
16
16

More than 5 years have passed since last update.

オシャレなPS1環境変数をセットしたら/bin/shが動かなくなってたときの対処

Last updated at Posted at 2016-01-02

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次情報がどこなのか全然わかりませんでした…。

16
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
16