使用Fabric嵌套cd调用时出现意外行为

时间:2013-08-26 19:26:38

标签: python bash fabric cd

我遇到了一些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')

但是,这是fab does_not_work

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

似乎嵌套cd会给我带来麻烦。

有一个很好的解释吗?

1 个答案:

答案 0 :(得分:1)

cd context managerprefix context manager在您调用命令时实际上并不运行命令,它们只是修改一些影响run()和/或{{后续调用的本地环境设置1}}。

因此当你的sudo()被执行时,它会被执行,它会在(run('some_random_command')cd=/folder/oneprefix=change_path_command)的上下文中运行,并且因为内部{{ 1}}优先于外部cd=/folder/two,最终结果是使用cd执行的单个命令。

查看cdprefix的源代码,以便更好地了解其工作原理 - 他们最终做的就是在输入时修改字典cd并退出。这些内容稍后会应用于_prefix_commands()的调用,该调用将通过cd /folder/two && change_path_command && some_random_command函数从fabric.state.envrun()调用。