Область действия переменной среды на основе каталогов - как реализовать?

У меня есть набор инструментов, которые мне нужно передать параметры в зависимости от проекта, над которым я работаю. Я хотел бы иметь возможность автоматически устанавливать пару переменных среды на основе текущего каталога. Поэтому, когда я переключался между каталогами, мои обычно используемые env vars также менялись. Пример:

Давайте текущий каталог foo, таким образом, если я делаю:

~/foo$ ./myscript --var1=$VAR1

VAR1 будет иметь некоторое значение на основе foo.

Тогда, скажем, я переключился на директорию бара. Если я сделаю:

~/bar$ ./myscript --var1=$VAR1

VAR1 теперь должен иметь некоторое значение на основе бара.

Это возможно? Как?

7 ответов

Решение

Программа ondir позволяет вам указать действия, которые будут выполняться при входе и выходе из каталогов в терминале

Существует direnv, который помогает вам делать это очень легко и элегантно. Просто определите файл.envrc в каталоге вашего проекта со всеми необходимыми переменными env, и он получит его, как только вы перейдете в эту папку.

Я написал другую реализацию этого, которая чем-то похожа на ondir. На самом деле я не знал об ondir, когда начал над ним работать. Однако есть некоторые ключевые отличия, которые могут быть полезны.

  • smartcd написан полностью в оболочке и полностью совместим с bash и zsh, даже более эзотерическими вариантами

  • smartcd будет запускать сценарии вплоть до иерархии каталогов вплоть до их общего предка, а не только для двух каталогов, которые вы вводите и покидаете. Это означает, что у вас может быть скрипт ~ / foo, который будет выполняться независимо от того, используете ли вы "cd ~ / foo" или "cd ~ / foo / bar"

  • у него есть "сохранение переменных", что является более автоматическим способом обработки переменных среды, в то время как ondir требует от вас явного и ручного удаления и / или сброса переменных

  • smartcd может работать с включенным "autocd", подключив команду подсказки (PROMPT_COMMAND в bash, precmd в zsh)

Вы можете найти smartcd на https://github.com/cxreg/smartcd

Это не то, что напрямую поддерживается встроенными функциями bash или любой другой обычной оболочки. Однако вы можете создать свою собственную команду "cd", которая будет делать все, что вы хотите. Например, вы можете использовать псевдоним cd для выполнения cd, а затем запустить специальный скрипт (например: ~/bin/oncd). Этот сценарий может найти новый каталог в базе данных и выполнить некоторые команды или посмотреть, есть ли в каталоге специальный файл (например,.env), загрузить ли его и т. Д.

Я так много делаю. Я создаю несколько командных файлов с одинаковыми именами в каталогах, где они мне нужны, которые только устанавливают переменные и вызывают общий скрипт. У меня даже есть командный файл, который создает другие маленькие файлы.

Это не красиво, но вы можете использовать комбинацию экспортированных переменных окружения и значения $PWD,

Например:

export VAR1=prefix
export prefix${HOME////_}_foo=42
export prefix${HOME////_}_bar=blah

затем myscript нужно только eval echo \${$VAR1${PWD////_}} чтобы получить значение на основе каталога.

Как насчет обернуть ваш сценарий с помощью функции (функция может быть размещена либо в вашем файле профиля bash /bashrc в системных, чтобы сделать доступными для всех пользователей).

myscript () { case $PWD in
/path/to/foo) path/to/myscript --var1=$VAR1 ;;
/path/to/bar) path/to/myscript --var2=$VAR1 ;;
*) ;;
case
}

Следовательно, функция myscript будет вызывать настоящий "myscript", зная, что делать, основываясь на текущем рабочем каталоге.

Возьмите это как пример:

hmontoliu@ulises:/tmp$ myscript () { case $PWD in /tmp) echo I\'m in tmp;; /var) echo I\'m in var;; *) echo I\'m neither in tmp nor in bar; esac; }
hmontoliu@ulises:/tmp$ myscript 
I'm in tmp
hmontoliu@ulises:/tmp$ cd /var
hmontoliu@ulises:/var$ myscript 
I'm in var
hmontoliu@ulises:/var$ cd /etc
hmontoliu@ulises:/etc$ myscript 
I'm neither in tmp nor in bar
Другие вопросы по тегам