2013-08-26 38 views
0

Fabric(Ubuntu 13.04上的版本1.7.0)遇到了一些問題。使用Fabric嵌套cd調用時發生意外的行爲

考慮一下這個功能:

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 s正在引起我的麻煩。

有沒有很好的解釋?

回答

1

cd context managerprefix context manager不實際運行的命令,當你調用它們,他們只是修改影響的run()和/或任何sudo()後續調用一些地方的環境設置。

所以你run('some_random_command')被執行時,它就會被執行時,它運行在(cd=/folder/oneprefix=change_path_commandcd=/folder/two)的範圍內,並且由於內cd優先於外cd,最終的結果是與執行的單個命令cd /folder/two && change_path_command && some_random_command

看看源代碼cdprefix到得到的是如何工作的一個更好的想法 - 他們都做最終修改是字典fabric.state.env當他們進入和退出。這些後來在_prefix_commands()的調用中應用,其通過_run_command()函數從run()sudo()調用。

+0

感謝您的回答!在[文檔](http://docs.fabfile.org/en/1.7/api/core/context_managers.html#fabric.context_managers.cd)中,他們實際上展示瞭如何嵌套'cd'命令,但第一個是絕對的,第二個是相對的。我怎樣才能實現我想要實現的目標?僅供參考,第一個絕對路徑是virtualenv的安裝位置,前綴命令是激活virtualenv的'source bin/activate',第二個絕對路徑是執行最終命令的位置。 – astorije

相關問題