環境を現在のディレクトリに依存させる方法 [複製]

環境を現在のディレクトリに依存させる方法 [複製]

現在のディレクトリがシェル環境を決定している場合は、これが便利/便利になると思います。これはコマンドです

cd /my/projects/foo

...たとえば、現在の作業ディレクトリが設定されるだけでなく(update、、、、$PWDなど)他の多くの環境要素(シェルオプション、変数、関数、エイリアスなど)も調整されます。単一ファイル。この方法は新しいコンテンツに合わせて調整されます。$OLDPWD$dirstackPWD

一見すると、これは実装する比較的簡単な方法のようです。特にzsh、すでにchpwdフックと$chpwd_functions配列をサポートしているからです。しかし、彼らが言ったように、悪魔は細部にあります1。

だから私自身の練習を始める前に質問しなければならないと思いました。このアイデアの成熟した実装を知っている人はいますか?

あるいはchpwd、et al。他に、zshこのようなことをするのに役立つ他のツールはありますか?特に、パッケージング/保存/復元環境のサポートを提供しますか? (環境オブジェクトと同じことを考えていますが、R変数だけでなくエイリアス、オプションなども考えています。)


FWIW、私はvirtualenvこの記事で説明されているアイデアといくつかの機能を共有するPythonを知っていますが、もちろんこれはPython関連の設定に限定されています。また、「現在の作業ディレクトリ」状態変数には含まれず、直交する「現在の仮想環境」である新しい「状態変数」も作成します。


1この問題をもう少し詳しく見てみると、いくつかの重要な質問がすぐに浮上します。例:カスタム環境を有効にしcdたい場合は、その後はどうなりますか?ファイルシステムのツリー構造に分割されたネストされたカスタム環境を持つことはできますか?シンボリックリンクはどうですか?たとえば、実際にシンボリックリンクならどうなりますか?あるいは、while isを実行すると、結果プロセスの環境はどうなりますか?待って、待って、待って。私はこれらの問題が必ずしも扱いにくい問題だとは思わないが、少なくとも完全に些細ではないと思う。/my/projects/foocd /my/projects/foo/modules/bar/my/projects/foo/modules/bar/my/shared/modules/bar/my/projects/foo/some_program$PWD/tmp

ベストアンサー1

特定のディレクトリの環境変数を設定するように設計された成熟したツールがあります。

この目的のために設計された他のツールと比較すると、direnvその中で最高です。主な利点の1つは、サポートすることです。削除するディレクトリを終了するときに環境変数を変更します。

direnvシェル環境スイッチャーです。 bash、zsh、tcsh、fish shell、elvishを接続してロードまたはロードする方法を知っています。削除する環境変数は現在のディレクトリによって異なります。これを通してプロジェクト別環境~/.profileファイルを乱すことなく変数をクリーンアップします。

direnv他の同様のツールとの違いは何ですか?

  • direnvGoで書かれています。急いでPythonで書かれた対応項目との比較
  • direnvサポートする削除する特定のディレクトリを終了するときに環境変数を使用する
  • direnv多くの殻で覆われている

類似プロジェクト

  • 環境モジュール- 最も古い(良い意味で)環境ローディングシステムの1つ
  • 自動環境- Lightはアンインストールをサポートしていません。 Pythonで書くと非常に遅いです。
  • zsh-autoenv- 豊富な機能を備えたautoenvとスマートCD:イベント入力/終了、ネスト、非表示(Zshのみ)。
  • アスダフ- プラグインシステムを備えた純粋なbashソリューション

おすすめ記事