Apa cara terbaik untuk menjalankan skrip saat masuk ke direktori?
Ketika saya pindah ke direktori baru, saya ingin bash untuk mengeksekusi script projectSettings.bash seperti RVM.
Apa cara terbaik untuk menjalankan skrip saat masuk ke direktori?
Ketika saya pindah ke direktori baru, saya ingin bash untuk mengeksekusi script projectSettings.bash seperti RVM.
Jawaban:
Anda dapat membuat cd
fungsi (dan pop
dan pushd
), dan membuatnya mendeteksi jika Anda memasuki direktori tertentu.
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
}
Jangan lakukan ini di direktori yang belum Anda daftar putih, karena akan membuatnya sangat mudah bagi seseorang untuk menipu Anda agar menjalankan kode arbitrer - kirim arsip kepada Anda, jadi Anda unzip, ubah ke direktori yang dibuat, dan Anda ' Saya sekarang menjalankan kode penyerang.
Saya tidak merekomendasikan pendekatan ini, karena itu berarti skrip akan dieksekusi bahkan jika Anda memasukkan direktori itu untuk beberapa alasan yang tidak terkait dengan mengerjakan proyek. Saya sarankan memiliki fungsi spesifik yang berubah ke direktori proyek dan sumber skrip pengaturan.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
dan ada tanpa keraguan cara yang lebih baik. Bahkan menggunakan $ PROMPT_COMMAND lebih baik!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Ini untuk menghindari masalah jika Anda melakukan sesuatu PATH = / mytools / bin: $ inisialisasi semacam PATH.
direnv mungkin apa yang Anda cari.
Berikut ini contoh yang diambil dari dokumentasi resmi:
$ 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