編輯 - 事實證明,這是固定在面料1.4.4。來自更新日誌:
[功能] #725:更新本地以允許覆蓋使用哪個本地shell。感謝穆斯塔法卡塔布。
所以原來的問題將是固定這樣的:
def test():
local('c', shell='/bin/bash')
我已經離開我的下面原來的答覆,只涉及到面料版本1.4.4 <。
因爲本地不使用bash。您可以在輸出中清楚地看到它
/bin/sh: c: command not found
請參閱?它使用/bin/sh
而不是/bin/bash
。這是因爲Fabric的local
命令在內部表現方面與run
稍有不同。 local
命令本質上是圍繞subprocess.Popen
python類的包裝。
http://docs.python.org/library/subprocess.html#popen-constuctor
這裏是你的問題。 Popen默認爲/bin/sh
。如果您自己調用Popen構造函數,但可以通過Fabric使用它,則可以指定其他shell。不幸的是,織物給你無法通過殼,如/bin/bash
。
對不起,不提供你的解決方案,但它應該回答你的問題。
編輯
這裏是有問題的代碼,直接從operations.py
文件中定義面料的local
功能拉:
p = subprocess.Popen(cmd_arg, shell=True, stdout=out_stream,
stderr=err_stream)
(stdout, stderr) = p.communicate()
正如你所看到的,它不會在任何通爲可執行文件關鍵字。這會導致它使用默認值,即/ bin/sh。如果它使用bash,它看起來像這樣:
p = subprocess.Popen(cmd_arg, shell=True, stdout=out_stream,
stderr=err_stream, executable="/bin/bash")
(stdout, stderr) = p.communicate()
但它沒有。這就是爲什麼他們在本地文檔中說以下內容:
本地只是一個簡單的包裝使用shell = True激活的內置Python子流程模塊。如果您需要做任何特殊的事情,請考慮直接使用子流程模塊。
但[Fabric docs](http://docs.fabfile.org/en/0.9.0/usage/env.html#shell)說: 「shell 默認值:**/bin/bash ** -l -c 執行例如run命令時用作shell封裝器的值必須能夠以「」的形式存在 - 例如默認使用Bash的-c選項,該命令字符串作爲其命令字符串值。」 –
是的,文檔是指運行命令和sudo。本地命令的作用與幕後的不同。我編輯了答案來顯示有問題的代碼。 –
謝謝你的澄清。這是非常豐富的 –