0

无法理解如何做一些我认为对 Fabric 来说应该很直观的事情。我想捕获远程执行命令产生的标准输出,然后在后续远程调用中使用结果。

但是,我遇到了非常难以理解的错误。我感觉到我正在做的事情有很多问题,但我不知道从哪里开始。也许有人可以帮我打破这个。

我有的:

...
with cd(env.repo):
    abbrev_hash = run('git log -1 --pretty="%h"')
run("rsync -r --exclude '.git/*' %s %s" % (env.repo, abbrev_hash))
... 

相关输出:

[cookcountyjail.recoveredfactory.net] 运行:git log -1 --pretty="%h" [cookcountyjail.recoveredfactory.net] 输出:[cookcountyjail.recoveredfactory.net] 输出:c6d4ea0 [cookcountyjail.recoveredfactory.net] 输出:[ cookcountyjail.recoveredfactory.net] 出:[cookcountyjail.recoveredfactory.net] 运行:rsync -r --exclude '.git/*' > /home/ubuntu/repos/cookcoc6d4ea0l_2.0-dev

[cookcountyjail.recoveredfactory.net] 出:/bin/bash:-c:第 1 行:意外标记附近的语法错误newline' [cookcountyjail.recoveredfactory.net] out: /bin/bash: -c: line 1: [cookcountyjail.recoveredfactory.net] 出:' [cookcountyjail.recoveredfactory.net] 出:

致命错误:run() 在执行时收到非零返回码 1!

c6d4ea0ed: rsync -r --exclude '.git/*' /home/ubuntu/repos/cookcountyjail_2.0-dev

执行:/bin/bash -l -c "cd /home/ubuntu/website/2.0/websites && export PATH=\"\$PATH:\"/home/ubuntu/website/2.0/websites/active\"\" && rsync -r --exclude '.git/*' /home/ubuntu/repos/cookcouc6d4ea0_2.0-dev "

4

1 回答 1

2

这不是你想要的吗?

def t1():
    captured = local('ls -alh')
    print captured

http://docs.fabfile.org/en/1.8/api/core/operations.html#fabric.operations.run

run 将远程程序的标准输出的结果作为单个(可能是多行)字符串返回。此字符串将显示失败和成功的布尔属性,指定命令是失败还是成功,并且还将包含返回代码作为 return_code 属性。此外,它包括请求和实际执行的命令字符串的副本,分别为 .command 和 .real_command。

local文档中也有这一点:

http://docs.fabfile.org/en/1.8/api/core/operations.html#fabric.operations.local

local 目前不能像 run/sudo 那样同时打印和捕获输出。capture kwarg 允许您根据需要在打印和捕获之间切换,默认为 False。

当 capture=False 时,本地子进程的 stdout 和 stderr 流直接连接到您的终端,但如果需要,您可以使用全局输出控件 output.stdout 和 output.stderr 来隐藏一个或两个。在此模式下,返回值的 stdout/stderr 值始终为空。

当 capture=True 时,您不会在终端中看到子进程的任何输出,但返回值将包含捕获的 stdout/stderr。

在任一情况下,与 run 和 sudo 一样,此返回值显示 return_code、stderr、失败和成功属性。有关详细信息,请参阅运行。

于 2013-10-11T04:53:46.577 回答