dsl2014
2015-11-19 06:35
浏览 329
已采纳

Golang exec.Command程序的奇怪行为

I have such code:

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)
        }
}

and its output is:

0

But when I will do simple modification:

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

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)
        }
}

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

图片转代码服务由CSDN问答提供 功能建议

我有这样的代码:

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

及其输出 是:

0

但是当我进行简单修改时:

  func main(){
 runWcFromStdinWorks(“ aaa 
”)
 runWcFromStdinWorks(“ bbb 
”)
} 
 
func runWcFromStdinWorks(s string){
 cmd:= exec.Command  (“ wc”,“ -l”)
 std  in,err:= cmd.StdinPipe()
如果err!= nil {
 log.Panic(err)
} 
 stdout,err:= cmd.StdoutPipe()
如果err!= nil {\  n log.Panic(err)
} 
 err = cmd.Start()
如果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条回答 默认 最新

  • 普通网友 2015-11-19 06:45
    最佳回答

    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:

    $ echo -n hello | wc -l
    0
    
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题