猿问

golang exec.Command 程序的奇怪行为

我有这样的代码:


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)

        }

}

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


POPMUISE
浏览 152回答 1
1回答

萧十郎

第s一个示例中的字符串没有换行,这会导致wc -l返回 0。您可以通过执行以下操作来查看此行为:$ echo -n hello | wc -l 0
随时随地看视频慕课网APP

相关分类

Go
我要回答