2015-06-26 39 views
0

我想建立一個基準測試工具,類似於unix工具time。我現在有這就是:流os/exec.Command

package main 

import (
    "fmt" 
    "os" 
    "os/exec" 
    "time" 
) 

func main() { 
    command := os.Args[1] 
    args := os.Args[2:] 
    cmd := exec.Command(command, args...) 
    start_time := time.Now().UnixNano() 
    stdout, err := cmd.Output() 

    if err != nil { 
     println(err.Error()) 
     return 
    } 

    print(string(stdout)) 
    total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time)/int64(time.Millisecond) 
    fmt.Println(total_time) 
} 

我這個問題是,輸出不是流,而是打印一次全部,以及古怪足以讓某些程序不盡然。

回答

2

最好的方法是避免完全接觸流。您可以直接將自己的文件描述符傳遞給stdout和stderr。

package main 

import (
    "fmt" 
    "os" 
    "os/exec" 
    "time" 
) 

func main() { 
    command := os.Args[1] 
    args := os.Args[2:] 
    cmd := exec.Command(command, args...) 
    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 
    start_time := time.Now() 

    err := cmd.Run() 
    if err != nil { 
     println(err.Error()) 
     return 
    } 

    total_time := int64(time.Since(start_time)/time.Millisecond) 
    fmt.Println(total_time) 
} 

而且,不應該被用來打印()。相反,請使用fmt.Print *函數之一。


total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time)/int64(time.Millisecond) 

此行極爲混亂。 int64(time.Nanosecond) * x解析爲1 * x或者僅僅是x

+0

當x的類型爲int時,OP可能會看到* x不起作用。 'total_time:= int64(...', –

+0

我是說乘以納秒是因爲納秒= 1而無操作。 –

+1

感謝您的所有建議,我很新,主要是複製和粘貼來自不同來源的東西 – brancz

0

我不確定你在print(string(stdout))這裏試圖做什麼,但它是沒有必要的,你面臨的問題可能是一些誤用的副作用。

func main() { 
    command := os.Args[1] 
    args := os.Args[2:] 
    cmd := exec.Command(command, args...) 
    cmd.Stdout = os.Stdout 
    cmd.Stderr = os.Stderr 
    start_time := time.Now().UnixNano() 

    if err != nil { 
     fmt.Println(err.Error()) 
     return 
    } 

    total_time := int64(time.Nanosecond) * (time.Now().UnixNano() - start_time)/int64(time.Millisecond) 
    fmt.Println(total_time) 
} 
+0

OP希望看到命令輸出到管道輸出stderout和stderr。 –

+0

@DanverBraganza這是一個簡單的改變,我會編輯它。 – evanmcdonnal