Кто-нибудь может объяснить, что на самом деле делает эта команда? eval «$ (/ Users / jsmith / anaconda / bin / conda shell.YOUR_SHELL_NAME hook)»

Я пытаюсь создать контейнер Docker с Anaconda и некоторыми другими вещами. После установки Anaconda мне нужно ее активировать. Когда я запускаю

CONDA_PATH=$HOME/anaconda3
eval "$($CONDA_PATH/bin/conda shell.bash hook)"

из моего контейнера, он работает. Но когда я включаю его в свой Dockerfile как

ENV CONDA_PATH $HOME/anaconda3
RUN eval "$($CONDA_PATH/bin/conda shell.bash hook)"

, это не так.

Я знаю, что eval выполняет аргументы как команду оболочки, но меня смущает перенос «$ ()» Кто-нибудь может объяснить, что он на самом деле делает?

Мой Dockerfile:

FROM ubuntu
MAINTAINER Kosh koshmariel@gmail.com
RUN apt-get update
RUN apt-get install htop
RUN apt-get install nano
WORKDIR /home
COPY Anaconda3-2020.02-Linux-x86_64.sh /home
ENV CONDA_PATH $HOME/anaconda3
RUN bash Anaconda3-2020.02-Linux-x86_64.sh -b -p $CONDA_PATH    #silent Anaconda installation without activation
#RUN eval "$($CONDA_PATH/bin/conda shell.bash hook)"
RUN $CONDA_PATH/bin/conda shell.bash hook
#RUN conda init
#RUN conda install -c conda-forge -y tensorflow
CMD /bin/bash
0
задан 27 June 2020 в 23:26

3 ответа

eval "$ (shell-command)" запустит shell-command и подаст свой вывод в оболочку как команда для execute.

Хук в этом контексте представляет собой механизм для присоединения пользовательских действий к некоторому событию, обрабатываемому программным обеспечением.

, поэтому $ CONDA_PATH / bin / conda shell.bash hook , вероятно, сгенерирует командную строку bash , которая при выполнении соединит Анаконду с работающим процессом bash и eval "$ ($ CONDA_PATH / bin / conda shell. bash hook) " позаботится о выполнении этой команды. Попробуйте запустить $ CONDA_PATH / bin / conda shell.bash hook непосредственно из приглашения оболочки, чтобы увидеть, что он производит, чтобы лучше понять, что происходит.

1
ответ дан 30 July 2020 в 22:18

Поскольку bac0n ответил в комментарии :

Он оценит результат / вывод подкоманды.

Например, eval "$ (echo echo test)" выведет test .

(Воспроизводится здесь с измененным форматированием.)

0
ответ дан 30 July 2020 в 22:18

Он выполняет сценарий bash для активации среды conda. Если вы хотите создать образ Docker с установленной Anaconda и активированной средой cond, в Dockerfile вам просто нужно добавить путь к anaconda в переменную среды PATH. (Он указывает каталоги, в которых находятся исполняемые программы*)

RUN /bin/bash ~/Anaconda3-2020.11-Linux-x86_64.sh -b -p
ENV PATH=$CONDA_DIR/bin:$PATH

$CONDA_DIR обычно имеет вид:

/home/$USER/anaconda3/bin

Таким образом, когда контейнер запустится, ваш conda env будет доступен

0
ответ дан 9 February 2021 в 07:10

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

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