ディレクトリに入るときにbashスクリプトを実行する


40

ディレクトリに入るときにスクリプトを実行する最良の方法は何ですか?
新しいディレクトリに移動するとき、bashがRVMのようにprojectSettings.bashスクリプトを実行するようにします。


2
すべてのディレクトリに、または選択したディレクトリに?それぞれに同じスクリプトがありますか?
エンゾチブ

すべてのディレクトリ。projectSettings.bashという名前のディレクトリにあるスクリプト(存在する場合)。
MageProspero

回答:


46

あなたは作ることができるcd機能を(とpoppushd)、そしてあなたがその特定のディレクトリを入力する場合、それは検出します。

cd () { builtin cd "$@" && chpwd; }
pushd () { builtin pushd "$@" && chpwd; }
popd () { builtin popd "$@" && chpwd; }
unset_all_project_settings () {
  # do whatever it takes to undo the effect of projectSettings.bash,
  # e.g. unset variables, remove PATH elements, etc.
}
chpwd () {
  case $PWD in
    /some/directory|/some/other/directory) . ./projectSettings.bash;;
    *) unset_all_project_settings;;
  esac
}

ホワイトリストに登録していないディレクトリでは、これを行わないでください。誰かにだまされて任意のコードを実行させることが非常に簡単になるからです。 veは攻撃者のコードを実行します。

このアプローチはお勧めしません。プロジェクトでの作業とは無関係の何らかの理由でそのディレクトリに入った場合でも、スクリプトが実行されることを意味するためです。プロジェクトディレクトリを変更し、設定スクリプトのソースとなる特定の関数を用意することをお勧めします。

myproj () {
  cd /some/directory && . ./projectSettings.bash
}

1
私はほんの少し前にRubyで始めました。RVMツールthoは完全にBashにあり、私が見たBashマジックの最高の作品の1つです。答えは少しばかげていると思います。なぜなら、あなたができる絶対に悪いことの一つは、次のようなものを乗り越えるcdことであり、間違いなくより良い方法があるからです。$ PROMPT_COMMANDを使用する方が優れています!
MageProspero

3
私は完全に間違っていて謝罪しました。RVMがcdをオーバーロードしていました。
MageProspero

5
(このコメントスレッドから接線方向のpro / anti-Rubyのものを削除しました)
Michael Mrozek

1
projectSettings.bashで、フラグ変数を追加して、ディレクトリを終了/再入力した場合に初期化を繰り返さないことをお勧めします。ですべてを囲みますif [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi。これは、PATH = / mytools / bin:$ PATHのような初期化を行う場合の問題を回避するためです。
クモ

5
@spiderむしろ、ディレクトリを離れる場合は、何らかの設定解除メカニズムが必要です。離れて再入した場合、設定を元に戻す必要があります!
ジル「SO-悪であるのをやめる」

0

direnvはあなたが探しているものかもしれません。

公式ドキュメントから抜粋した例を次に示します。

$ cd ~/my_project
$ echo ${FOO-nope}
nope
$ echo export FOO=foo > .envrc
.envrc is not allowed
$ direnv allow .
direnv: reloading
direnv: loading .envrc
direnv export: +FOO
$ echo ${FOO-nope}
foo
$ cd ..
direnv: unloading
direnv export: ~PATH
$ echo ${FOO-nope}
nope
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.