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

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

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

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

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

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

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

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

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

Ответы [ 7 ]

17 голосов
/ 01 мая 2011

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

9 голосов
/ 20 июля 2016

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

8 голосов
/ 15 июня 2011

Я написал другую реализацию этого, которая чем-то похожа на 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

2 голосов
/ 01 мая 2011

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

0 голосов
/ 01 мая 2011

Как насчет обернуть ваш скрипт функцией (функцию можно поместить либо в ваш файл bash profile / 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
0 голосов
/ 01 мая 2011

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

Например:

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

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

0 голосов
/ 01 мая 2011

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

...