0

我在使用 Fabric(Ubuntu 13.04 上的 1.7.0 版)时遇到了一些问题。

考虑这个函数:

def does_not_work():
  with cd('/absolute/folder/one/'):
    with prefix('change_path_command'):
      with cd('/absolute/folder/two/'):
        run('some_random_command')

我希望它执行与以下相同的命令:

def works():
  run('cd /absolute/folder/one/ && change_path_command && cd /absolute/folder/two/ && some_random_command')

但是,这里是 Fabric 输出fab does_not_work

Requested: some_random_command
Executed: /bin/bash -l -c "cd /absolute/folder/two/ && change_path_command && some_random_command"

似乎嵌套cds 给我带来了麻烦。

有很好的解释吗?

4

1 回答 1

1

cd上下文管理器和上下文prefix管理器在您调用它们时实际上并不运行命令,它们只是修改一些影响后续调用run()和/或的本地环境设置sudo()

所以当你run('some_random_command')被执行时,它会被执行,它在 ( cd=/folder/one, prefix=change_path_command, cd=/folder/two) 的上下文中运行,并且由于内部cd优先于外部cd,最终结果是使用 执行的单个命令cd /folder/two && change_path_command && some_random_command

查看源代码cdprefix更好地了解它是如何工作的——他们最终所做的只是fabric.state.env在进入和退出时修改字典。这些稍后将应用于对 的调用_prefix_commands(),该调用从函数调用run()sudo()通过_run_command()函数调用。

于 2013-08-26T20:10:13.470 回答