运行shell脚本中的conda有关命令无显示无反应问题

项目场景:

在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 的状态,因此请在执行之前仔细考虑

猜你喜欢

转载自blog.csdn.net/PellyKoo/article/details/129240788