Переопределение встроенного в настройки исходного кода 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 перейти в промежуточный каталог и найти соответствующий файл. То же самое для каждого из двух других.

Другие вопросы по тегам