2016-12-30 97 views
0

我試圖做多管道一起去:Golang exec.Command多個管道

ctags := exec.Command("ctags", "-x", "--c-types=f", "./tmp/"+fileName) 
grep := exec.Command("grep", "member") 
awk := exec.Command("awk", "'{$1=$2=$3=$4=\"\"; print $0}'") 
grep.Stdin, _ = ctags.StdoutPipe() 
awk.Stdin, _ = grep.StdoutPipe() 
awk.Stdout = os.Stdout 
_ = grep.Start() 
_ = awk.Start() 
_ = ctags.Run() 
_ = grep.Wait() 
_ = awk.Wait() 

fmt.Println(awk) 

這是預期的輸出應該是什麼樣子:

$ ctags -x --c-types=f ./tmp/genetic_algorithm.py | grep member | awk '{$1=$2=$3=$4=""; print $0}' 
    def __init__(self, vector, fitness_function): 
    def __init__(self, population_size=10, crossover_points=[.3, .6], 
    def apply_crossover(self, genotype_1, genotype_2): 
    def apply_mutation(self, child_genotype): 
    def calc_population_fitness(self, individuals): 
    def evolve(self): 
    def final_genotype(self): 
    def fitness(self): 
    def generate_offspring(self, selected): 
    def genotype(self, indiv): 
    def get_accuracy(nn_hidden_structure=[10]): 
    def parse_bitstring(self, genotype): 
    def run(self): 
    def select_for_crossover(self): 
    def slice_vector(self, vector): 
    def validate_vector(self, vector, max_nodes=100): 
    def vector_from_bitstring(self, genotype): 

這是我什麼越來越:

&{/usr/bin/awk [awk '{$1=$2=$3=$4=""; print $0}'] [] 0xc4204ce020 0xc42007e008 <nil> [] <nil> 0xc4201fa900 exit status 2 <nil> <nil> true [0xc4204ce020 0xc42007e008 0xc4204ce048] [0xc4204ce048] [] [] 0xc420070360 <nil>} 

我發現與圍棋的管道命令的幾個例子,但大多隻能管兩個命令。有這個例子https://gist.github.com/dagoof/1477401,但是當我根據這個邏輯來安排我的代碼時,我得到了同樣的問題。我的管道是否正確?該命令只是對該Python文件執行繁瑣的ctags,然後grep指示方法的任何行,然後只忽略grepped輸出的前四列。

+0

難道你不想打印'awk'命令的輸出而不是指向'Cmd'結構的指針的值嗎? – e0k

+0

@ e0k是的,我想捕獲awk的Stdout。現在就開始工作。如果它很混亂,你可以忽略fmt.Println()。 – Soubriquet

+0

您可能會發現將'Stderr'流重定向到'os.Stderr',以便您可以看到錯誤消息:'awk.Stderr = os.Stderr'等。 – e0k

回答

0

問題同:

awk := exec.Command("awk", "'{$1=$2=$3=$4=\"\"; print $0}'") 

我只需要刪除單引號。

awk := exec.Command("awk", "{$1=$2=$3=$4=\"\"; print $0}")