В настоящее время я перезаписываю встроенную команду cd
для получения файла среды, основанного на среде, которая в настоящее время создается.
Мой главный вопрос касается того, как работает cd
, когда я включил shopt -s autocd
- полагаясь на autocd
, чтобы добраться до определенных каталогов, мои строки source
не выполняются. Где я могу узнать больше о том, как autocd
работает cd
и почему это работает только при явном вызове cd
?
Мой .bashrc
содержит это для «автоматического поиска»:
cd() {
builtin cd "$@"
if [[ `pwd` == '/home/ubuntu/deploys/staging' ]]; then
echo "Sourcing ~/.appconfig/staging.env!";
source /home/ubuntu/.appconfig/staging.env;
fi
if [[ `pwd` == '/home/ubuntu/deploys/demo' ]]; then
echo "Sourcing ~/.appconfig/demo.env!"
source /home/ubuntu/.appconfig/demo.env;
fi
if [[ `pwd` == '/home/ubuntu/deploys/prod' ]]; then
echo "Sourcing ~/.appconfig/prod.env!"
source /home/ubuntu/.appconfig/prod.env;
fi
}
Я знаю, что это немного опасно и может иметь непредвиденные последствия, но я могу с этим смириться. Если есть лучшее решение для автоматического выбора списка переменных среды при cd
входе в каталог, я весь в ушах.
Я не могу найти где внутренности autocd
документируются, я боюсь, что необходимо будет проверить исходный код. Однако как Glenn указывает, если это не выполняется при использовании autocd
, затем autocd
вероятно, не использует cd
.
Я могу думать о двух обходных решениях. Во-первых, можно использовать PROMPT_COMMAND
как предложенный Glenn. Добавьте это к Вашему .bashrc
:
sourcedir() {
if [[ `pwd` == '/home/ubuntu/deploys/staging' ]]; then
echo "Sourcing ~/.appconfig/staging.env!";
source /home/ubuntu/.appconfig/staging.env;
fi
if [[ `pwd` == '/home/ubuntu/deploys/demo' ]]; then
echo "Sourcing ~/.appconfig/demo.env!"
source /home/ubuntu/.appconfig/demo.env;
fi
if [[ `pwd` == '/home/ubuntu/deploys/prod' ]]; then
echo "Sourcing ~/.appconfig/prod.env!"
source /home/ubuntu/.appconfig/prod.env;
fi
}
PROMPT_COMMAND="sourcedir"
Теперь, каждый раз Вы перемещаетесь в эти каталоги, независимо от того, как Вы добрались там, файлы будут получены. Главный недостаток этого подхода состоит в том, что файлы будут получены каждый раз, когда подсказку показывают, не только когда Вы первый шаг в каталог. Вы могли избежать этого путем установки переменной в полученном файле и только определения источника, если та переменная не установлена, но это действительно становится довольно сложным.
Я вместо этого предположил бы, что Вы настраиваете псевдонимы для перемещения в каждый из каталогов и определения источника соответствующих файлов. Добавьте эти строки к Вашему ~/.bashrc
(source
на самом деле псевдоним для .
но .
является более портативным):
alias staging="cd /home/ubuntu/deploys/staging && . /home/ubuntu/.appconfig/staging.env"
alias demo="cd /home/ubuntu/deploys/demo && . /home/ubuntu/.appconfig/demo.env"
alias prod="cd /home/ubuntu/deploys/prod && . /home/ubuntu/.appconfig/prod.env"
Теперь, можно работать staging
перемещаться в каталог подготовки и получать соответствующий файл. То же для каждого из других двух.