golang exec.Command程序的奇怪行为

时间:2015-11-19 06:35:15

标签: go

我有这样的代码:

func main() {
        s := "foobar"
        cmd := exec.Command("wc", "-l")
        stdin, err := cmd.StdinPipe()
        if err != nil {
                log.Panic(err)
        }
        stdout, err := cmd.StdoutPipe()
        if err != nil {
                log.Panic(err)
        }
        err = cmd.Start()
        if err != nil {
                log.Panic(err)
        }
        io.Copy(stdin, bytes.NewBufferString(s))
        stdin.Close()
        io.Copy(os.Stdout, stdout)
        err = cmd.Wait()
        if err != nil {
                log.Panic(err)
        }
}

,其输出为:

0

但是当我做简单的修改时:

func main() {
        runWcFromStdinWorks("aaa\n")
        runWcFromStdinWorks("bbb\n")
}

func runWcFromStdinWorks(s string) {
        cmd := exec.Command("wc", "-l")
        stdin, err := cmd.StdinPipe()
        if err != nil {
                log.Panic(err)
        }
        stdout, err := cmd.StdoutPipe()
        if err != nil {
                log.Panic(err)
        }
        err = cmd.Start()
        if err != nil {
                log.Panic(err)
        }
        io.Copy(stdin, bytes.NewBufferString(s))
        stdin.Close()
        io.Copy(os.Stdout, stdout)
        err = cmd.Wait()
        if err != nil {
                log.Panic(err)
        }
}

它有效,但为什么?它只是调用方法为什么第一个版本不起作用?

1 个答案:

答案 0 :(得分:4)

第一个示例中的字符串s没有新行,这会导致wc -l返回0.您可以通过执行以下操作来查看此行为:

$ echo -n hello | wc -l
0