Виконайте bash-скрипти при введенні каталогу


40

Який найкращий спосіб виконати скрипт при введенні в каталог?
Коли я переходжу до нового каталогу, я б хотів bash виконати проект scriptSettings.bash, як і RVM.


2
У кожен каталог чи вибраний? І той самий сценарій для кожного, чи ні?
enzotib

Кожен каталог. Сценарій у директорії з назвою projectSettings.bash, якщо він існує.
MageProspero

Відповіді:


46

Ви можете створити 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
}

1
У Рубі я почав лише трохи. Інструмент RVM tho повністю знаходиться в Bash і є одним з найкращих творів магії Баша, який я бачив. Я думаю, що відповідь трохи нерозумна, тому що одна з абсолютно гірших речей, яку ти коли-небудь можеш зробити, - це проїхати щось на кшталт, cdі там, без сумніву, кращий шлях. Навіть використання $ PROMPT_COMMAND краще!
MageProspero

3
Я абсолютно помилявся і вибачаюся. RVM перевантажував компакт-диск.
MageProspero

5
(видалено деякі дотичні матеріали про / анти-Ruby з цієї
теми

1
в projectSettings.bash я пропоную вам додати змінну прапора, щоб не повторювати ініціалізацію у випадку виходу / повторного введення каталогу. Тож додайте все до if [ -z $MYSETTINGS ] ; then export MYSETTINGS=1 ; echo your settings here ; fi. Це потрібно, щоб уникнути проблем, якщо ви робите щось PATH = / mytools / bin: $ PATH ініціалізація.
павук

5
@spider Швидше за все, має бути якийсь механізм скидання, якщо ви виходите з каталогу. Якщо ви виїдете та перейдете назад, вам слід повернути налаштування!
Жил "ТАК - перестань бути злим"

0

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.