Який найкращий спосіб виконати скрипт при введенні в каталог?
Коли я переходжу до нового каталогу, я б хотів bash виконати проект scriptSettings.bash, як і RVM.
Який найкращий спосіб виконати скрипт при введенні в каталог?
Коли я переходжу до нового каталогу, я б хотів bash виконати проект scriptSettings.bash, як і RVM.
Відповіді:
Ви можете створити 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
}
cd
і там, без сумніву, кращий шлях. Навіть використання $ PROMPT_COMMAND краще!
if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi
. Це потрібно, щоб уникнути проблем, якщо ви робите щось PATH = / mytools / bin: $ PATH ініціалізація.
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