我遇到了一些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
:
Requested: some_random_command
Executed: /bin/bash -l -c "cd /absolute/folder/two/ && change_path_command && some_random_command"
似乎嵌套cd
会给我带来麻烦。
有一个很好的解释吗?
答案 0 :(得分:1)
cd
context manager和prefix
context manager在您调用命令时实际上并不运行命令,它们只是修改一些影响run()
和/或{{后续调用的本地环境设置1}}。
因此当你的sudo()
被执行时,它会被执行,它会在(run('some_random_command')
,cd=/folder/one
,prefix=change_path_command
)的上下文中运行,并且因为内部{{ 1}}优先于外部cd=/folder/two
,最终结果是使用cd
执行的单个命令。
查看cd
和prefix
的源代码,以便更好地了解其工作原理 - 他们最终做的就是在输入时修改字典cd
并退出。这些内容稍后会应用于_prefix_commands()
的调用,该调用将通过cd /folder/two && change_path_command && some_random_command
函数从fabric.state.env
和run()
调用。