Как лучше всего выполнить скрипт при входе в каталог?
Когда я перехожу в новый каталог, я бы хотел, чтобы bash выполнял сценарий projectSettings.bash так же, как это делает RVM.
Как лучше всего выполнить скрипт при входе в каталог?
Когда я перехожу в новый каталог, я бы хотел, чтобы bash выполнял сценарий projectSettings.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