Подтвердить что ты не робот

Область переменных окружения, основанная на каталогах - как реализовать?

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

Пусть текущая директория foo, поэтому, если я делаю:

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

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

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

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

Например:

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

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

Ответ 7

Как обернуть ваш script функцией (функция может быть помещена либо в ваш файл 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", зная, что делать на основе текущего рабочего каталога.

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

[email protected]:/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; }
[email protected]:/tmp$ myscript 
I'm in tmp
[email protected]:/tmp$ cd /var
[email protected]:/var$ myscript 
I'm in var
[email protected]:/var$ cd /etc
hmonto[email protected]:/etc$ myscript 
I'm neither in tmp nor in bar