2012-06-12 312 views
1

您好我必須執行一個shell命令:diff <(ssh -n [email protected] cat /vms/cloudburst.qcow2.*)<(ssh -n [email protected] cat /虛擬機/ cloudburst.qcow2) 我試圖Python執行復雜shell命令

cmd="diff <(ssh -n [email protected] cat /vms/cloudburst.qcow2.*) <(ssh -n [email protected] cat /vms/cloudburst.qcow2)" 
args = shlex.split(cmd) 
output,error = subprocess.Popen(args,stdout = subprocess.PIPE, stderr= subprocess.PIPE).communicate() 

但是我收到一個錯誤DIFF:額外的操作貓

我很新的蟒蛇。任何幫助,將不勝感激

+0

您正在將參數「<(ssh」,「-n」,「root @ ...」,「cat」字面地傳遞給diff工具。在shell中輸入時,「<(...) 「部分首先得到評估,並且生成的(文件)作爲參數傳遞給diff命令。您使用的是什麼shell? – niko

+0

我正在使用bash – neorg

回答

7

您正在使用<(...)(進程替換)的語法,由shell解釋。提供shell=True到POPEN得到它使用shell:

cmd = "diff <(ssh -n [email protected] cat /vms/cloudburst.qcow2.*) <(ssh -n [email protected] cat /vms/cloudburst.qcow2)" 
output,error = subprocess.Popen(cmd, shell=True, executable="/bin/bash", stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 

既然你不想要的是Bourne shell(/ bin/sh的),使用可執行參數來確定要使用的外殼。

+0

我試過了,但是我得到一個錯誤'/ bin/sh:語法錯誤:「(」unexpected「。 – neorg

+0

已更新,以顯示如何指示要使用的外殼。 –

3

您在命令行中使用了一種稱爲process substitiution的特殊語法。這由大多數現代shell(bash,zsh)支持,但不支持/ bin/sh。因此,Ned建議的方法可能不起作用。 (如果另一個shell提供了/ bin/sh並且沒有「正確模擬」sh的行爲,但它不能保證)。 試試這個:

cmd = "diff <(ssh -n [email protected] cat /vms/cloudburst.qcow2.*) <(ssh -n [email protected] cat /vms/cloudburst.qcow2)" 
output,error = subprocess.Popen(['/bin/bash', '-c', cmd], stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 

這基本上就是殼= True參數,不過它/斌/慶典而不是/ bin/sh的(如subprocess docs描述)。

+0

感謝您的快速響應。它工作正常!:) – neorg

+0

完美!簡單,有效 –