2016-09-13 88 views
0

我有下面的代码从标准输出输出数据到一个文件:如何从标准输出输出到一个字符串中golang

cmd := exec.Command("ls","lh") 
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) 
defer writer.Flush() 

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

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

我需要从标准输出输出到一个字符串值,而不是文件。我如何实现这一目标?

是否有另一个函数,可以让我更改io.Copy行去io.Copy(myStringVariable,stdoutPipe),因为我需要读取命令的输出并对其应用一些处理?

在此先感谢

+0

您可能刚刚将该文件分配为命令的Stdout,并避免了管道和复制goroutine(其中您正在丢失读/写错误), – JimB

回答

5

你不需要管,作家,够程等只需使用Cmd.Output

out, err := exec.Command("ls","lh").Output() 

您可以根据需要与string(out)

+0

简而又甜!谢谢 –

0

使用bytes.Buffer。它本质上是一个[]byte,它还实现了io.Reader和io.Writer接口(等等)。

cmd := exec.Command("ls","lh") 

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

var buf bytes.Buffer 
writer := bufio.NewWriter(buf) 
defer writer.Flush() 

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

go io.Copy(writer, stdoutPipe) 
cmd.Wait() 
fmt.Println(string(buf.Bytes())) 
2

您可以将输出[]byte转换为string设置文件为命令的stdout

f, err := os.Create("./out.txt") 
if err != nil { 
    panic(err) 
} 
defer f.Close() 

cmd := exec.Command("ls", "-lh") 
cmd.Stdout = f 
cmd.Stderr = os.Stderr 

if err := cmd.Run(); err != nil { 
    panic(err) 
}