golang exec.Command程序的奇怪行为

huangapple go评论117阅读模式
英文:

Strange behaviour of golang exec.Command program

问题

我有这样的代码:

  1. func main() {
  2. s := "foobar"
  3. cmd := exec.Command("wc", "-l")
  4. stdin, err := cmd.StdinPipe()
  5. if err != nil {
  6. log.Panic(err)
  7. }
  8. stdout, err := cmd.StdoutPipe()
  9. if err != nil {
  10. log.Panic(err)
  11. }
  12. err = cmd.Start()
  13. if err != nil {
  14. log.Panic(err)
  15. }
  16. io.Copy(stdin, bytes.NewBufferString(s))
  17. stdin.Close()
  18. io.Copy(os.Stdout, stdout)
  19. err = cmd.Wait()
  20. if err != nil {
  21. log.Panic(err)
  22. }
  23. }

它的输出是:

0

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

  1. func main() {
  2. runWcFromStdinWorks("aaa\n")
  3. runWcFromStdinWorks("bbb\n")
  4. }
  5. func runWcFromStdinWorks(s string) {
  6. cmd := exec.Command("wc", "-l")
  7. stdin, err := cmd.StdinPipe()
  8. if err != nil {
  9. log.Panic(err)
  10. }
  11. stdout, err := cmd.StdoutPipe()
  12. if err != nil {
  13. log.Panic(err)
  14. }
  15. err = cmd.Start()
  16. if err != nil {
  17. log.Panic(err)
  18. }
  19. io.Copy(stdin, bytes.NewBufferString(s))
  20. stdin.Close()
  21. io.Copy(os.Stdout, stdout)
  22. err = cmd.Wait()
  23. if err != nil {
  24. log.Panic(err)
  25. }
  26. }

它可以工作,但是为什么?它只是调用了一个方法,为什么第一个版本不起作用?

英文:

I have such code:

  1. func main() {
  2. s := "foobar"
  3. cmd := exec.Command("wc", "-l")
  4. stdin, err := cmd.StdinPipe()
  5. if err != nil {
  6. log.Panic(err)
  7. }
  8. stdout, err := cmd.StdoutPipe()
  9. if err != nil {
  10. log.Panic(err)
  11. }
  12. err = cmd.Start()
  13. if err != nil {
  14. log.Panic(err)
  15. }
  16. io.Copy(stdin, bytes.NewBufferString(s))
  17. stdin.Close()
  18. io.Copy(os.Stdout, stdout)
  19. err = cmd.Wait()
  20. if err != nil {
  21. log.Panic(err)
  22. }
  23. }

and its output is:

0

But when I will do simple modification:

  1. func main() {
  2. runWcFromStdinWorks("aaa\n")
  3. runWcFromStdinWorks("bbb\n")
  4. }
  5. func runWcFromStdinWorks(s string) {
  6. cmd := exec.Command("wc", "-l")
  7. stdin, err := cmd.StdinPipe()
  8. if err != nil {
  9. log.Panic(err)
  10. }
  11. stdout, err := cmd.StdoutPipe()
  12. if err != nil {
  13. log.Panic(err)
  14. }
  15. err = cmd.Start()
  16. if err != nil {
  17. log.Panic(err)
  18. }
  19. io.Copy(stdin, bytes.NewBufferString(s))
  20. stdin.Close()
  21. io.Copy(os.Stdout, stdout)
  22. err = cmd.Wait()
  23. if err != nil {
  24. log.Panic(err)
  25. }
  26. }

It works, but why? Its just calling method why first version is not working?

答案1

得分: 4

在第一个示例中,字符串s没有换行符,这导致wc -l返回0。你可以通过以下方式观察到这种行为:

  1. $ echo -n hello | wc -l
  2. 0
英文:

The string s in the first example does not have a new line, which causes wc -l to return 0. You can see this behavior by doing:

  1. $ echo -n hello | wc -l
  2. 0

huangapple
  • 本文由 发表于 2015年11月19日 14:35:14
  • 转载请务必保留本文链接:https://go.coder-hub.com/33796826.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定