ディレクトリに入るときにスクリプトを実行する最良の方法は何ですか?
新しいディレクトリに入るとき、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つの選択肢です。