Переопределение встроенного в настройки источника env cd, возможно использовать с autocad?

В настоящее время я перезаписываю встроенную команду 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 входе в каталог, я весь в ушах.

3
задан 28 September 2015 в 22:58

1 ответ

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

2
ответ дан 29 September 2015 в 08:58
  • 1
    @LisaS: хорошо, хороший, тогда мы видим то же самое. Btw, Chrome необходимость, или Firefox работал бы? Я думаю, что FF работал бы без этого вида стычки. – Gunnar Hjalmarsson 24 December 2016 в 10:22

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

Похожие вопросы: