如何让Bash仅在Conda环境不存在时执行创建与数据库下载?
解决Conda环境检查与创建脚本的逻辑问题
你的问题出在shell逻辑运算符的优先级和执行顺序上。原命令里的||和&&优先级相同,会从左到右依次执行:
- 如果环境存在(
test返回0),||后面的echo会被跳过,但紧接着的&&会因为前面的test成功而执行后面的conda env create等命令——这显然不是你想要的。 - 只有当环境不存在时,
||触发echo,然后&&因为echo成功(返回0)执行后续命令,但这时候逻辑是对的,可前面的成功场景却出错了。
要让后续的创建、激活、下载操作仅在环境不存在时才整体执行,你需要把这些命令打包成一个逻辑块,用大括号{}包裹(小括号会开启子shell,不适合conda activate这类需要影响当前shell的操作):
修正后的脚本代码
test -d ~/miniconda3/envs/antismash_v5 || { echo "Conda environment does not exist. Initialising conda environment......" conda env create -f antismash.yml conda activate antismash_v5 download-antismash-databases }
如果要写成单行形式,注意大括号前后的空格和每个命令结尾的分号:
test -d ~/miniconda3/envs/antismash_v5 || { echo "Conda environment does not exist. Initialising conda environment......"; conda env create -f antismash.yml; conda activate antismash_v5; download-antismash-databases; }
为什么这样有效?
大括号{}会把里面的命令当作一个单一的代码块,只有当test命令返回非零(环境不存在)时,||才会触发整个代码块的执行。这样就严格保证了:
- 环境存在时,所有创建相关的命令都不会运行
- 环境不存在时,依次执行提示、创建环境、激活、下载数据库的操作
内容的提问来源于stack exchange,提问作者Lamma
相关产品推荐
相关产品推荐

