Переопределение встроенного в настройки исходного кода cd, возможно ли использовать с autocd?
Я в настоящее время переопределяю встроенный 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
Я в уши.
1 ответ
Я не могу найти где внутренние органы autocd
документированы, боюсь, вам придется проверить исходный код. Однако, как указывает Гленн, если это не выполняется при использовании autocd
, затем autocd
вероятно не использует cd
,
Я могу придумать два обходных пути. Во-первых, вы можете использовать PROMPT_COMMAND
как предложил Гленн. Добавьте это к вашему .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
перейти в промежуточный каталог и найти соответствующий файл. То же самое для каждого из двух других.