Python doit模块运行任务动作时如何选择指定使用的shell?
doit指定Bash作为执行Shell的解决方法
报错的根本原因是[[属于Bash专属扩展语法,doit默认调用/bin/sh执行命令动作,而多数Linux发行版的/bin/sh是不支持Bash扩展语法的Dash,因此执行时会抛出[[: not found错误,返回码127表示对应语法无法识别。
方案1:全局设置默认Shell(推荐)
直接在dodo.py文件开头添加如下代码,即可将所有任务的默认执行Shell改为/bin/bash,无需修改原有任务的动作定义:
import doit doit.action.DEFAULT_SHELL = "/bin/bash"
方案2:为单个任务指定Shell
如果仅部分任务需要使用Bash执行,不需要全局修改,可以对需要的任务显式使用CmdAction类并指定shell参数:
from doit.action import CmdAction def task_phase_dataset(): return { "actions": [ CmdAction("[[ ! -d phasing ]] && mkdir phasing", shell="/bin/bash") ], # 其余任务配置(target、file_dep等)保持不变 }
替代方案:兼容POSIX Shell语法
如果不想修改Shell配置,可以将命令改写为符合POSIX标准的写法,原生支持/bin/sh执行:
原命令[[ ! -d phasing ]] && mkdir phasing可改写为以下任意一种:
- 用POSIX兼容的条件判断:
[ ! -d phasing ] && mkdir phasing - 直接使用
mkdir的-p参数,无需提前判断目录是否存在:mkdir -p phasing
内容的提问来源于stack exchange,提问作者Pedro Inácio
相关产品推荐
相关产品推荐

