2016-06-13 108 views
1

我想重定向gnu make。 想要將ALL重定向到STDOUT和all.log,並且只向error.log發生錯誤。在python中使用os.system時出錯,但在shell中不存在

下面是我的程序

#!/usr/bin/env python 
import optparse 
import os 
import sys 
import commands 

command = 'make all > >(tee -a all.log) 2>&1 2> >(tee -a error.log)' 
SysReturnVal=os.system(command) 

print "system return value is ", SysReturnVal 

當我執行它越來越

sh: -c: line 0: syntax error near unexpected token `>' 
sh: -c: line 0: `make all > >(tee -a all.log ) 2>&1 2> >(tee -a error.log)' 

但是在Linux上的bash shell執行同一指令的執行沒有錯誤。

make all > >(tee -a all.log) 2>&1 2> >(tee -a error.log) 

爲什麼在使用os.system在python腳本中運行時失敗,但在終端/ bash shell中沒有?

+0

哪個殼您使用的?它看起來像你正在試圖做一些在你的shell中工作的非可移植的東西,而不是用'sh'。 – Biffen

+0

sh指向centos中的bash 6.4。我在bash上嘗試了相同的命令,並且它工作正常,並且在python中,與os.system相同的命令因sh錯誤而失敗。 –

+1

當您通過名爲'sh'的符號鏈接運行Bash時,Bash將以'sh'兼容模式運行,並且不會讓您使用任何Bashisms。您可以嘗試交互式運行'/ bin/sh'並查看其差異。 – Biffen

回答

0

os.system()來電* nix system()來電。

的系統()庫函數使用fork(2),以創建子進程 ,其執行使用EXECL在命令中指定的外殼命令(3) 如下: EXECL( 「/ bin/sh的」, 「sh」,「-c」,命令,(char *)0);

更多信息:doc

你必須做一些像os.system("/bin/bash <command>")

0

os.system開始/bin/sh,你在你的命bashism:

>(....) 

您需要啓動的bash:

os.system("bash -c '{}'".format(command)) 

還要記住,如果你在你的命令中使用單引號,他們需要進行轉義打印:'\'',如:

command="ls '\\''.'\\''" 
# And it's even worse in single quotes: 
command='ls \'\\\'\'.\'\\\'\'' 
相關問題