检查 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。并且 grep
以 0
退出(成功),只要至少与所提供的模式匹配;这在 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/ ]]
我有一个 运行 简单 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。并且 grep
以 0
退出(成功),只要至少与所提供的模式匹配;这在 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/ ]]