2009-12-09 48 views

Trả lời

4

Sử dụng exec.Run bằng cách xác định Pipe như stdout (và stderr nếu bạn muốn). Nó sẽ trả về cmd, có chứa một số os.File trong các trường Stdout (và Stderr). Sau đó, bạn có thể đọc nó bằng cách sử dụng ví dụ ioutil.ReadAll.

Ví dụ:

package main 

import (
    "exec"; 
    "io/ioutil"; 
) 

func main() { 
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil { 
     b, _ := ioutil.ReadAll(cmd.Stdout) 
     println("output: " + string(b)) 
    } 
} 
+3

Tôi không nghĩ rằng gói "exec" tồn tại nữa. Tôi đã phải sử dụng "os/exec" như được liệt kê bởi Fatih dưới đây. –

2

Sử dụng exec.Run, chuyển Ống cho chế độ xuất chuẩn. Đọc từ ống mà nó trả về.

+0

Đó có lẽ nên được gọi là exec.Run() (mà trả về một Cmd), chứ không phải là Cmd .Chạy. – esm

+0

Rất tiếc. Cảm ơn. – Glomek

70

Có một cách dễ dàng hơn bây giờ:

package main 

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

func main() { 
    out, err := exec.Command("date").Output() 
    if err != nil { 
     log.Fatal(err) 
    } 
    fmt.Printf("The date is %s\n", out) 
} 

đâu out là sản phẩm standart. Đó là trong các định dạng []byte, nhưng bạn có thể thay đổi nó thành chuỗi một cách dễ dàng với:

string(out) 

Bạn cũng có thể sử dụng CombinedOutput() thay vì Output() trả về đầu ra tiêu chuẩn và sai số chuẩn.

+3

Điều này rất có thể là câu trả lời được chấp nhận ngay bây giờ. Câu trả lời được chấp nhận thậm chí không biên dịch nữa. –

2

Để có được cả stdout và stderr thành chuỗi riêng biệt, bạn có thể sử dụng bộ đệm byte như vậy:

cmd := exec.Command("date") 
var outb, errb bytes.Buffer 
cmd.Stdout = &outb 
cmd.Stderr = &errb 
err := cmd.Run() 
if err != nil { 
    log.Fatal(err) 
} 
fmt.Println("out:", outb.String(), "err:", errb.String()) 
Các vấn đề liên quan