Я пытаюсь изменить поведение conda чтобы сначала обновить $PATH для установки miniconda а затем запустить команду. Это потому, что большая часть моей работы с python не использует версию conda и я хочу сохранить PYTHONPATH . Итак, вот функция bash:

$type conda
conda is a function
conda ()
{
    CONDA=~/miniconda2;
    export PATH=$CONDA/bin:$PATH;
    $CONDA/bin/conda $@
}

Эта функция используется?

$which conda
/usr/local/bin/conda

Нет. Итак, почему conda выбирает бывший исполняемый файл на основе $PATH вместо функции bash?

Я на macos sierra .

2 ответа2

2

Ответ AFH правильный, но не отвечает на прямой вопрос. Прямой ответ: сценарий на основе PATH не выбран перед функцией bash. Команда which не сообщает вам, что будет выполнять оболочка, она просто ищет PATH . type (встроенный в bash) - это тот, который говорит вам, что на самом деле произойдет, когда вы введете эту команду. Вот короткая демонстрация:

$ type democmd
democmd is a function
democmd () 
{ 
    echo "This is the democmd *function*."
}
$ which democmd
/usr/local/bin/democmd
$ more /usr/local/bin/democmd
#!/bin/bash
echo "This is the democmd *script*, running from /usr/local/bin"
$ democmd
This is the democmd *function*.
$ command democmd    # The "command" command ignores aliases and functions
This is the democmd *script*, running from /usr/local/bin
1

Несколько моментов:-

  • PATH не будет обновляться, пока функция conda будет вызвана.
  • PATH будет обновляться при каждом вызове conda , давая постоянно увеличивающийся PATH .
  • Ваш вызов двоичного conda содержит ссылки на каталоги и поэтому не использует PATH , так зачем пытаться обновить его?

Если вам необходимо обновить PATH , вы должны проверить это необходимо, давая что - то вроде:

CONDA=~/miniconda2
[ ${PATH#*$CONDA/bin} == $PATH ] && export PATH=$CONDA/bin:$PATH
conda () { $CONDA/bin/conda $@; }

Другими словами, запускайте команды настройки среды перед объявлением conda() , а не внутри него.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .