Bir dizine girerken bir betiği çalıştırmanın en iyi yolu nedir?
Yeni bir dizine taşındığımda, bash'ın RVM'nin yaptığı gibi projectSettings.bash betiğini çalıştırmasını istiyorum.
Bir dizine girerken bir betiği çalıştırmanın en iyi yolu nedir?
Yeni bir dizine taşındığımda, bash'ın RVM'nin yaptığı gibi projectSettings.bash betiğini çalıştırmasını istiyorum.
Yanıtlar:
Sen yapabilir cd
(ve bir işlev pop
ve pushd
) ve bu özel dizin girerseniz o algılamak olun.
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
}
Bunu beyaz listeye almadığınız dizinlerde yapmayın, çünkü birisinin sizi rasgele kod çalıştırması için kandırması çok kolay olacaktır - size bir arşiv gönderir, bu yüzden onu açarsınız, oluşturduğunuz dizine değiştirirsiniz ve şimdi saldırganın kodunu çalıştır.
Bu yaklaşımı önermiyorum, çünkü komut dosyası, proje üzerinde çalışmakla ilgisi olmayan bir nedenden dolayı bu dizine girseniz bile yürütülecek demektir. Proje dizininde değişen ve ayar betiğini sağlayan belirli bir işleve sahip olmanızı öneririm.
myproj () {
cd /some/directory && . ./projectSettings.bash
}
cd
ve şüphesiz daha iyi bir yol var. $ PROMPT_COMMAND kullanmak bile daha iyi!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Bu, PATH = / mytools / bin: $ PATH türünde bir başlangıç yapmanız durumunda problemleri önlemek içindir.
diren , aradığın şey olabilir.
İşte resmi belgelerden alınmış bir örnek:
$ 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