go语言的exec.Command方法执行失败

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

The go language exec.Command method execute failed

问题

这个命令执行失败了,并且没有log.txt存在。

为什么?

英文:
  1. package main
  2. import (
  3. "os/exec"
  4. "fmt"
  5. )
  6. func main(){
  7. cmd := exec.Command("find", "/home/d101270c/cbe", "-name","*.log", ">", "log.txt")
  8. fmt.Println(cmd)
  9. err := cmd.Run()
  10. if err != nil {
  11. fmt.Printf("%s\n", err)
  12. return
  13. }
  14. }

Run result:

  1. <1067 linux20 [d101270c] :/home/d101270c>uname -a
  2. Linux linux20 2.6.16.60-0.21-smp #1 SMP Tue May 6 12:41:02 UTC 2008 x86_64 x86_64 x86_64 GNU/Linux
  3. <1068 linux20 [d101270c] :/home/d101270c>tgo
  4. &{/usr/bin/find [find /home/d101270c/cbe -name *.log > log.txt] [] <nil> <nil> <nil> [] <nil> <nil> <nil> <nil> false [] [] [] [] <nil>}
  5. exit status 1

This command execute failed, and no log.txt exists.

Why?

答案1

得分: 3

你正在传递find的参数,比如>',它无法理解,但是shell可以。这对我有效:

  1. (07:28) jnml@tsat:~/src/tmp/SO/11623232$ cat main.go
  2. package main
  3. import (
  4. "fmt"
  5. "os"
  6. "os/exec"
  7. )
  8. func main() {
  9. //cmd := exec.Command("sh", "-c", "find /home/d101270c/cbe -name \\*.log > log.txt")
  10. cmd := exec.Command("sh", "-c", "find "+os.Getenv("HOME")+"/src -name \\*.go > go.txt")
  11. fmt.Println(cmd)
  12. err := cmd.Run()
  13. if err != nil {
  14. fmt.Printf("%s\n", err)
  15. return
  16. }
  17. }
  18. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ go build main.go
  19. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ ./main
  20. &{/bin/sh [sh -c find /home/jnml/src -name \*.go > go.txt] [] <nil> <nil> <nil> [] <nil> <nil> <nil> <nil> false [] [] [] [] <nil>}
  21. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ ls -l
  22. celkem 1408
  23. -rw-r--r-- 1 jnml jnml 7845 2012-07-24 07:29 go.txt
  24. -rwxr-xr-x 1 jnml jnml 1428319 2012-07-24 07:29 main
  25. -rw-r--r-- 1 jnml jnml 332 2012-07-24 07:28 main.go
  26. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ wc go.txt
  27. 131 131 7845 go.txt
  28. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ tail go.txt
  29. /home/jnml/src/github.com/nsf/gocode/config.go
  30. /home/jnml/src/github.com/nsf/gocode/rpc.go
  31. /home/jnml/src/github.com/nsf/gocode/_gccgo/package.go
  32. /home/jnml/src/github.com/nsf/gocode/_goremote/goremote.go
  33. /home/jnml/src/github.com/nsf/gocode/scope.go
  34. /home/jnml/src/github.com/nsf/gocode/formatters.go
  35. /home/jnml/src/github.com/nsf/gocode/autocompletefile.go
  36. /home/jnml/src/github.com/nsf/gocode/decl.go
  37. /home/jnml/src/tmp/go/main.go
  38. /home/jnml/src/tmp/SO/11623232/main.go
  39. (07:29) jnml@tsat:~/src/tmp/SO/11623232$
英文:

You're passing find arguments like `>', which it doesn't understand, but the shell does. This works for me:

  1. (07:28) jnml@tsat:~/src/tmp/SO/11623232$ cat main.go
  2. package main
  3. import (
  4. &quot;fmt&quot;
  5. &quot;os&quot;
  6. &quot;os/exec&quot;
  7. )
  8. func main() {
  9. //cmd := exec.Command(&quot;sh&quot;, &quot;-c&quot;, &quot;find /home/d101270c/cbe -name \\*.log &gt; log.txt&quot;)
  10. cmd := exec.Command(&quot;sh&quot;, &quot;-c&quot;, &quot;find &quot;+os.Getenv(&quot;HOME&quot;)+&quot;/src -name \\*.go &gt; go.txt&quot;)
  11. fmt.Println(cmd)
  12. err := cmd.Run()
  13. if err != nil {
  14. fmt.Printf(&quot;%s\n&quot;, err)
  15. return
  16. }
  17. }
  18. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ go build main.go
  19. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ ./main
  20. &amp;{/bin/sh [sh -c find /home/jnml/src -name \*.go &gt; go.txt] [] &lt;nil&gt; &lt;nil&gt; &lt;nil&gt; [] &lt;nil&gt; &lt;nil&gt; &lt;nil&gt; &lt;nil&gt; false [] [] [] [] &lt;nil&gt;}
  21. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ ls -l
  22. celkem 1408
  23. -rw-r--r-- 1 jnml jnml 7845 2012-07-24 07:29 go.txt
  24. -rwxr-xr-x 1 jnml jnml 1428319 2012-07-24 07:29 main
  25. -rw-r--r-- 1 jnml jnml 332 2012-07-24 07:28 main.go
  26. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ wc go.txt
  27. 131 131 7845 go.txt
  28. (07:29) jnml@tsat:~/src/tmp/SO/11623232$ tail go.txt
  29. /home/jnml/src/github.com/nsf/gocode/config.go
  30. /home/jnml/src/github.com/nsf/gocode/rpc.go
  31. /home/jnml/src/github.com/nsf/gocode/_gccgo/package.go
  32. /home/jnml/src/github.com/nsf/gocode/_goremote/goremote.go
  33. /home/jnml/src/github.com/nsf/gocode/scope.go
  34. /home/jnml/src/github.com/nsf/gocode/formatters.go
  35. /home/jnml/src/github.com/nsf/gocode/autocompletefile.go
  36. /home/jnml/src/github.com/nsf/gocode/decl.go
  37. /home/jnml/src/tmp/go/main.go
  38. /home/jnml/src/tmp/SO/11623232/main.go
  39. (07:29) jnml@tsat:~/src/tmp/SO/11623232$

答案2

得分: 1

也许,在这里你甚至不需要使用shell。请参考http://golang.org/pkg/os/exec/#Cmd.Output。

Alex

英文:

Perhaps, you do not even need to use shell here. See http://golang.org/pkg/os/exec/#Cmd.Output.

Alex

huangapple
  • 本文由 发表于 2012年7月24日 10:22:41
  • 转载请务必保留本文链接:https://go.coder-hub.com/11623232.html
匿名

发表评论

匿名网友

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

确定