我正在尝试使用fabric (v2.6)来运行一些命令,这些命令使用bash的extglob和dotglob。
当我跑步时:
c.run(f"shopt -s extglob dotglob && rm -Rf {project_path}* !(.|..|.venv) && shopt -u extglob dotglob")我知道这个错误:
`bash: -c: line 0: syntax error near unexpected token `('`我使用&&,因为我发现在单独的运行调用中执行shopt -s extglob dotglob对于后续的运行调用不会持久。我很确定使用&&可以启用extglob和dotglob,因为当我这样做时:
`c.run("shopt -s extglob dotglob && shopt")`它打印出选项列表,并启用了extglob和dotglob。
我哪里出问题了?
发布于 2022-03-08 12:09:46
不幸的是,extglob似乎不能与Python一起使用。
来自bash文档
extglob更改某些字符的解析方式。在和后续命令之间必须有一个(而不仅仅是分号)才能使用它。
但是来自织物文档
虽然Fabric可以用于许多类似shell脚本的任务,但是有一个有点不直观的问题:每个
run.有自己独特的shell会话。为了让Fabric在命令运行后可靠地确定它的标准输出/错误和返回代码是什么,这是必需的。
幸运的是,使用Bash的GLOBIGNORE变量可以实现类似的事情
GLOBIGNORE变量可用于限制匹配模式的文件名集。如果设置了GLOBIGNORE,则从匹配列表中删除与GLOBIGNORE中的模式之一匹配的每个文件名。如果设置了nocaseglob选项,则对GLOBIGNORE中的模式进行匹配而不考虑情况。文件名。然后..。在设置GLOBIGNORE和not null时总是被忽略。但是,将GLOBIGNORE设置为非空值的效果是启用dotglob shell选项,因此所有其他文件名都以‘.’开头。会匹配的。要获得忽略以“.”开头的文件名的旧行为,请将“.*”作为GLOBIGNORE中的模式之一。取消GLOBIGNORE时,将禁用dotglob选项。
在展开通配符时,这也很容易忽略.和..,因此要删除目录中的所有文件(“.venv”除外),我们可以这样做。
c.run("GLOBIGNORE='.venv'; rm -Rf {project_path}*")发布于 2022-03-06 06:00:35
extglob更改某些字符的解析方式。在shopt -s extglob和后续命令之间必须有一个换行符(而不仅仅是分号)来使用它。
因此,您必须适当地更改python代码,以便使用换行符而不是&&。
或者只做bash调用在python中直接做的事情。
https://stackoverflow.com/questions/71367899
复制相似问题