项目场景:
在docker中搭建了一个容器,想要在打开容器的时候自动运行shell脚本,提示进入想要使用的conda环境,这些可选的conda环境均为已经搭建好的(共有5个)。具体的shell脚本,如下所示
#!/bin/bash
while true
do
echo "##########################################"
echo "#######welcome to deeplearningenv#########"
echo "###please select the env you want to use##"
echo "#########(e).exit the current env#########"
echo "#########(q).quit the menu################"
echo "##########1.pytorch1.6.0##################"
echo "##########2.pytorch1.8.0##################"
echo "##########3.tensorflow1.14.0##############"
echo "##########4.caffe#########################"
echo "##########5.mxnet#########################"
echo "##########################################"
read -p "Please enter your choice: " choice
case $choice in
1) source activate pytorch1.6.0;break;;
2) source activate pytorch1.8.0;break;;
3) source activate tensorflow1.14.0;break;;
4) source activate caffe;break;;
5) source activate mxnet1.7.0;break;;
e) conda deactivate;;
q) break;;
*) echo "Invalid choice. Please try again.";;
esac
done
将上述代码写入start.sh脚本后。把脚本放在root
目录下并且修改.bashrc
文件,在其尾部加入
bash /root/start.sh
问题描述
运行脚本时,选择环境所对应的序号键入后,并未进入环境,如下图所示,直接跳出了环境。
原因分析:
在执行 source activate pytorch1.6.0
命令时,它会修改当前 shell 的环境变量,以便使用 pytorch1.6.0 环境中安装的命令和程序。这些环境变量包括 PATH,LD_LIBRARY_PATH,PYTHONPATH 等,它们会被设置为指向 pytorch1.6.0 环境中对应的目录和文件。但是,在执行 shell
脚本时,脚本在自己的子 shell 中运行,而不是在当前 shell 中运行。因此,在 shell
脚本中执行 source activate pytorch1.6.0
命令不会修改当前 shell 的环境变量,因为它只会在脚本的子 shell 中生效。
解决方案:
为了在 shell 脚本中激活 Conda 环境,我们可以使用以下两种方法:
方法一:
在脚本中使用 conda activate pytorch1.6.0
命令代替 source activate pytorch1.6.0
。这是 Conda 4.4 以后的版本引入的一种新方式,它可以在不使用 source 命令的情况下激活 Conda 环境,因此可以在 shell 脚本中使用。
方法二
在脚本中使用 source activate
命令,但是在执行脚本时使用 bash -l 或 source 命令强制脚本在当前 shell 中运行,而不是在子 shell 中运行。例如:
bash -l start.sh
或者
source /root/start.sh
这将使脚本在当前 shell 中运行,从而允许 source activate 命令修改当前 shell 的环境变量。但是也要注意,这种方法可能会影响当前 shell 的状态,因此请在执行之前仔细考虑