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

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

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

答え1

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
}

答え2

ディレンフあなたが探しているものかもしれません。

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

答え3

これは私のCD機能です

function cd()
{
    if [ -f .exit.sh ]; then
        source .exit.sh;
    fi

    if [ -z $* ]; then
        builtin cd ~
    else
        builtin cd "$*"
    fi

    if [ -f .enter.sh ]; then
        source .enter.sh;
    fi
}

その後、「.enter.sh」または「.exit.sh」からスクリプトを作成できます。

答え4

オンディル端末にディレクトリを入力するときにスクリプトを実行するもう1つの選択肢です。

関連情報