2013-09-24 93 views
20

Tôi đang cố gắng chạy lệnh shell, capture stdout và ghi đầu ra đó vào một tệp. Tuy nhiên, tôi dường như bị thiếu một vài bước, vì tệp tôi đang cố gắng viết trống khi chương trình tồn tại. Làm thế nào tôi có thể nắm bắt được stdout của lệnh và viết nó vào một tập tin?Trong golang làm thế nào tôi có thể viết stdout của một exec.Cmd vào một tập tin?

package main 

import (
    "bufio" 
    "io" 
    "os" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("echo", "'WHAT THE HECK IS UP'") 

    // open the out file for writing 
    outfile, err := os.Create("./out.txt") 
    if err != nil { 
     panic(err) 
    } 
    defer outfile.Close() 

    stdoutPipe, err := cmd.StdoutPipe() 
    if err != nil { 
     panic(err) 
    } 

    writer := bufio.NewWriter(outfile) 

    err = cmd.Start() 
    if err != nil { 
     panic(err) 
    } 

    go io.Copy(writer, stdoutPipe) 
    cmd.Wait() 
} 

Trả lời

12

Bạn cần xóa bộ ghi. Thêm dòng sau:

writer := bufio.NewWriter(outfile) 
    defer writer.Flush() 
+0

Duh, tôi biết tôi đã bỏ lỡ điều gì đó. – jergason

32

Nhờ KirkMcDonald trên kênh #go-nuts irc, tôi giải quyết này bằng cách gán các tập tin đầu ra để cmd.Stdout, có nghĩa là thiết bị xuất chuẩn ghi trực tiếp vào tập tin. Nó trông giống như thế này:

package main 

import (
    "os" 
    "os/exec" 
) 

func main() { 

    cmd := exec.Command("echo", "'WHAT THE HECK IS UP'") 

    // open the out file for writing 
    outfile, err := os.Create("./out.txt") 
    if err != nil { 
     panic(err) 
    } 
    defer outfile.Close() 
    cmd.Stdout = outfile 

    err = cmd.Start(); if err != nil { 
     panic(err) 
    } 
    cmd.Wait() 
} 
7

Bạn cũng có thể sử dụng:

cmd.Stdout = os.Stdout 

mà sẽ chuyển hướng tất cả đầu ra cmd để đầu ra tiêu chuẩn của hệ điều hành.