检查 conda env 是否存在,如果不存在则创建 bash

Check if conda env exists and create if not in bash

我有一个 运行 简单 python 应用程序的构建脚本。我正在尝试将其设置为 运行 对于已安装 conda 且位于其 PATH 中的任何用户。没有其他先决条件。我已经取得了相当大的成就,但我想提高回头客的效率。

build_run.sh

conda init bash
conda env create --name RUN_ENV --file ../run_env.yml -q --force
conda activate RUN_ENV
python run_app.py
conda deactivate

我想让脚本检查 RUN_ENV 是否已经存在并激活它,而不是每次都强制创建它。我试过了

ENVS=$(conda env list | awk '{print }' )
if [[ conda env list = *"RUN_ENV"* ]]; then
   conda activate RUN_ENV
else 
   conda env create --name RUN_ENV --file ../run_env.yml -q
   conda activate RUN_ENV
   exit
fi;
python run_app.py
conda deactivate

但它总是返回错误并尝试创建 RUN_ENV

我不确定 conda env list 是如何工作的(我不使用 Anaconda);并且您当前的 if-测试含糊不清

但我要冒险了,猜测这就是你要找的东西

#!/usr/bin/env bash
# ...
find_in_conda_env(){
    conda env list | grep "${@}" >/dev/null 2>/dev/null
}

if find_in_conda_env ".*RUN_ENV.*" ; then
   conda activate RUN_ENV
else 
# ...

你也可以这样做

而不是把它放到一个单独的函数中
# ...
if conda env list | grep ".*RUN_ENV.*" >/dev/null 2>&1; then
# ...

如果您使用command grouping

,整洁和清晰的加分
# ...
if { conda env list | grep 'RUN_ENV'; } >/dev/null 2>&1; then
# ...

if 只是检查 exit code。并且 grep0 退出(成功),只要至少与所提供的模式匹配;这在 if 语句

中计算为“真”

(grep 会匹配并成功,即使模式只是 'RUN_ENV' ;) )


ENVS=$(conda env list | awk '{print }' )awk 部分几乎什么都不做。我希望输出采用表格格式,但 {print } 不进行过滤,我相信您正在寻找 {print $n} 其中 n 是列号或 awk /PATTERN/ {print} 其中 PATTERN很可能 RUN_ENV 并且只打印具有 PATTERN 的行。

但即便如此,将 table 存储在字符串变量中还是会很混乱。你可能想要 array.

然后来到你的 if-条件,它在语法上是错误的。

  • [[ 构造用于比较 :整数、字符串、正则表达式
  • 但是在 = 的左边我们有一个命令 conda env list
    • 我相信也是$ENVS
    • 的内容
  • 因此我们可以假设您的意思是 [[ "${ENVS}" == *"RUN_ENV"* ]]
    • 或者 [[ $(conda env list) == *"RUN_ENV"* ]]
  • 但是,正则表达式匹配table...在我看来不是很直观
  • 但它有效...有点
  • 正则表达式匹配的正确简洁语法是
    • [[ ${value} =~ /PATTERN/ ]]