web-dev-qa-db-ja.com

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

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

41
MageProspero

cdを関数(およびpopおよびpushd)にして、その特定のディレクトリに入ったかどうかを検出させることができます。

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
}

ホワイトリストに登録していないディレクトリでは、これを行わないでください。だれかがあなたをだまして任意のコードを実行させるのを非常に簡単にするので、アーカイブを送信し、アーカイブを解凍して、作成したディレクトリに変更します。攻撃者のコードを実行します。

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

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

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
1
navigaid