有人能解释一下这个命令实际上做什么吗?eval“$(/Users/jsmith/anaconda/bin/conda shell.YOUR_SHELL_NAME hook)”

有人能解释一下这个命令实际上做什么吗?eval“$(/Users/jsmith/anaconda/bin/conda shell.YOUR_SHELL_NAME hook)”

我正在尝试使用 Anaconda 和其他一些东西创建一个 Docker 容器。安装 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 将参数作为 shell 命令执行,但我对包装“$()”感到困惑,有人能解释一下它实际上做了什么吗?

我的Dockerfile:

FROM ubuntu
MAINTAINER Kosh [email protected]
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

答案1

eval "$(shell-command)"将运行shell-command并喂养它输出作为命令传给 shell 来执行。

A在此上下文中,是一种将自定义操作附加到软件处理的某些事件的机制。

so$CONDA_PATH/bin/conda shell.bash hook可能会生成一个bash命令行,执行后,它会将 Anaconda 连接到正在运行的bash进程,并eval "$($CONDA_PATH/bin/conda shell.bash hook)"负责执行该命令。尝试$CONDA_PATH/bin/conda shell.bash hook直接从 shell 提示符运行以查看它生成的内容,以便更好地了解正在发生的事情。这可能有助于您理解为什么它在 Docker 上下文中不起作用。

答案2

它执行一个 bash 脚本以激活 conda 环境。如果您想创建一个安装了 Anaconda 并激活了 conda 环境的 Docker 映像,则只需在 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 环境将可用

答案3

作为bac0n已回答在评论中

它将评估子命令的结果/输出。

例如,eval "$(echo echo test)"将输出test

(此处复制,格式经过修改。)

相关内容