<p>错误消息非常有用-它告诉您conda没有从脚本运行所在的子shell中正确设置。要在脚本中使用conda,您将需要(如错误消息所示)首先运行<code>conda init bash</code>(或任何shell)。conda的行为及其设置方式取决于conda版本,但版本4.4+行为的原因是<code>conda</code>依赖于conda shell本身通常设置的某些环境变量。最重要的是,<a href="https://github.com/conda/conda/blob/master/CHANGELOG.md#recommended-change-to-enable-conda-in-your-shell" rel="noreferrer">this changelog entry</a>解释了为什么您的<code>conda activate</code>和<code>deactivate</code>命令不再像您在4.4及更高版本中期望的那样工作。</p>
<p>有关这方面的更多讨论,请参见GitHub上的<a href="https://github.com/conda/conda/issues/7126" rel="noreferrer">official conda issue</a>。</p>
<hr/>
<p>编辑:更多的研究告诉我,错误消息中提到的<code>conda init</code>函数实际上是一个新的v4.6.0特性,它允许快速设置环境,以便您可以使用<code>conda activate</code>,而不是旧的<code>source activate</code>。但是,这之所以有效,是因为它添加/更改了当前shell的多个环境变量,并且还更改了RC文件(例如:<code>.bashrc</code>),并且RC文件的更改永远不会在当前shell中进行—只在新创建的shell中进行。(当然,除非你再次引用.bashrc)。事实上,<code>conda init --help</code>也这么说:</p>
<blockquote>
<p>IMPORTANT: After running <code>conda init</code>, most shells will need to be closed and restarted for changes to take effect</p>
</blockquote>
<p>但是,您显然已经运行了<code>conda init</code>,因为您可以交互使用<code>conda activate</code>。事实上,如果您打开.bashrc,您应该能够看到conda添加的几行代码,它们教您的shell在哪里查找conda命令。不过,脚本的问题在于,.bashrc是<em>而不是</em>源于运行shell脚本的子shell(有关更多信息,请参见<a href="https://stackoverflow.com/a/17221436/7315159">this answer</a>)。这意味着,即使您的非登录交互式shell看到conda命令,您的非交互式脚本子shell也不会-无论您调用<code>conda init</code>多少次。</p>
<p>这导致了一个猜想(我自己在Linux上没有conda,所以我无法测试它),通过这样运行您的脚本:</p>
<pre><code>bash -i shell_script.sh
</code></pre>
<p>您应该看到<code>conda activate</code>工作正常。为什么?<code>-i</code>是一个bash标志,它告诉shell您开始在交互模式下运行,这意味着它将自动为您的.bashrc提供源代码。这应该足以让您在脚本中使用conda,就像您正常使用它一样。</p>