如何在buildbot的shell命令行中添加"&&"?

8

我需要使用"&&"来一步执行多条命令。因此,我创建了以下工厂:

f1 = factory.BuildFactory()
f1.addStep(shell.ShellCommand, command=["sh", "-c", "pwd", "&&", "cd", "/home/xxx/yyy", "&&", "pwd"])

在执行过程中,发现buildbot的处理方式如下,这使得无法执行该操作。
sh -c pwd '&&' cd /home/xxx/yyy '&&' pwd

What I expected is

sh -c pwd && cd /home/xxx/yyy && pwd

请问有人能帮我解决这个问题吗?谢谢。


2
怎么样,我们可以编写一个脚本来包装这些命令,然后从你的代码中调用该脚本? - Kent
谢谢你的评论,Kent。我现在把命令放在一个脚本中了。现在它可以正常工作了。 - Di Liu
1个回答

7

既然您已经使用了/bin/sh,只需使用单个字符串调用它:

f1.addStep(shell.ShellCommand, command="pwd && cd /home/xxx/yyy && pwd")

根据文档所述:

ShellCommand的参数是:

command

一个字符串列表(首选)或单个字符串(不推荐),指定要运行的命令。首选使用字符串列表,因为它可以直接用作 argv 数组。使用单个字符串(带有嵌入空格)需要构建从者将字符串传递给 /bin/sh 进行解释,这就引发了关于如何转义或解释 shell 元字符的所有问题。

虽然不推荐,但您仍然需要 shell,因为 && 仅在 shell 中解释。调用 sh 只会是多余的。


我尝试过并发现,这个带有 "&&" 的命令会被解释为 'pwd && cd /home/xxx/yyy && pwd',而不是 pwd && cd /home/xxx/yyy && pwd。所以它不起作用。我怀疑 buildbot 会特殊处理像 "&&" 这样的字符。无论如何,还是谢谢。 - Di Liu
2
@DiLiu 尝试将其作为字符串而不是数组的单个元素传递。请参见更新。我认为我刚刚误解了“字符串列表(首选)或单个字符串(不鼓励)”。 - konsolebox
1
你是对的。我尝试了一下,你更新后的命令可以工作。非常感谢你的帮助。 - Di Liu
这是否假定从机上有一个 shell?在 Windows 构建从机上会有什么行为? - qneill
@qneill 您应该使用字符串列表。shpwd必须存在于Windows机器上。我只能想象软件是如何工作的,也许您可以尝试 command=["C:/Path/To/sh.exe", "-c", "pwd && cd /home/xxx/yyy && pwd"]。如果您正在尝试使它便携,那么将会很困难,因为即使您决定在sh.exe上使用cmd.exe,语法和路径形式也会不同。这实际上取决于您想要如何实现您的命令。另外,既然它已经涉及到在不同平台上运行,那么发布另一个问题就已经合法了。 - konsolebox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接