29

作業中のプロジェクトに応じてパラメーターを渡す必要があるツールのセットがあります。現在のディレクトリに基づいて、いくつかの環境変数を自動的に設定できるようにしたいと思います。そのため、ディレクトリを切り替えると、よく使用するenv変数も変更されます。例:

現在のディレクトリをfooにしましょう。したがって、次のようにします。

~/foo$ ./myscript --var1=$VAR1

VAR1にはfooベースの値があります。

次に、barディレクトリに切り替えたとしましょう。私が行った場合:

~/bar$ ./myscript --var1=$VAR1

これで、VAR1にバーベースの値が表示されます。

それは可能ですか?どのように?

4

7 に答える 7

23

このようなことを非常に簡単かつエレガントな方法で行うのに役立つdirenvがあります。プロジェクトディレクトリに必要なすべてのenv変数を含む.envrcファイルを定義するだけで、そのフォルダにcdするとソースになります。

于 2016-07-20T13:17:58.830 に答える
22

ondirプログラムを使用すると、ターミナルでディレクトリに出入りするときに実行するアクションを指定できます。

于 2011-05-01T14:15:32.517 に答える
9

私はこれの別の実装を書きました。これはondirにいくぶん似ています。作業を始めたとき、私は実際にondirについて知りませんでした。ただし、役立つ可能性のある重要な違いがいくつかあります。

  • smartcdは完全にシェルで記述されており、bashおよびzshと完全に互換性があり、さらに難解なオプションもあります。

  • smartcdは、出入りする2つのディレクトリだけでなく、ディレクトリ階層の上下にある共通の祖先までスクリプトを実行します。これは、「cd〜/ foo」または「cd〜/ foo /bar」のどちらでも実行される〜/fooスクリプトを持つことができることを意味します

  • これには、環境変数をより自動的に処理する「変数スタッシング」がありますが、ondirでは、変数を明示的および手動で削除またはリセットする必要があります。

  • smartcdは、プロンプトコマンド(bashではPROMPT_COMMAND、zshではprecmd)をフックすることにより、「autocd」をオンにして動作できます。

smartcdはhttps://github.com/cxreg/smartcdで見つけることができます

于 2011-06-15T04:31:04.377 に答える
2

これは、bashやその他の一般的なシェルの組み込み機能で直接サポートされるものではありません。ただし、必要な処理を実行する独自の「cd」コマンドを作成できます。たとえば、cdのエイリアスを作成してcdを実行してから、特別なスクリプト(〜/ bin / oncdなど)を実行できます。そのスクリプトは、データベースで新しいディレクトリを検索していくつかのコマンドを実行したり、ディレクトリに特別なファイル(.envなど)があるかどうかを確認してロードしたりすることができます。

于 2011-05-01T14:26:41.260 に答える
0

私はこの種のことをたくさんします。変数を設定して共通スクリプトを呼び出すだけの同じ名前のバッチファイルをディレクトリにいくつか作成します。他の小さなファイルを作成するバッチファイルもあります。

于 2011-05-01T14:05:26.663 に答える
0

これはきれいではありませんが、エクスポートされた環境変数との値の組み合わせを使用できます$PWD

例えば:

export VAR1=prefix
export prefix${HOME////_}_foo=42
export prefix${HOME////_}_bar=blah

次に、ディレクトリベースの値を取得myscriptするだけで済みます。eval echo \${$VAR1${PWD////_}}

于 2011-05-01T14:55:48.183 に答える
0

スクリプトを関数でラップするのはどうですか(関数は、システムファイルのbashプロファイル/ bashrcファイルのいずれかに配置して、すべてのユーザーが利用できるようにすることができます)。

myscript () { case $PWD in
/path/to/foo) path/to/myscript --var1=$VAR1 ;;
/path/to/bar) path/to/myscript --var2=$VAR1 ;;
*) ;;
case
}

したがって、関数myscriptは、現在の作業ディレクトリに基づいて何をすべきかを知っている実際の「myscript」を呼び出します。

これを例として取り上げます。

hmontoliu@ulises:/tmp$ myscript () { case $PWD in /tmp) echo I\'m in tmp;; /var) echo I\'m in var;; *) echo I\'m neither in tmp nor in bar; esac; }
hmontoliu@ulises:/tmp$ myscript 
I'm in tmp
hmontoliu@ulises:/tmp$ cd /var
hmontoliu@ulises:/var$ myscript 
I'm in var
hmontoliu@ulises:/var$ cd /etc
hmontoliu@ulises:/etc$ myscript 
I'm neither in tmp nor in bar
于 2011-05-01T17:10:36.490 に答える