我有一堆系统命令,它们与将新内容附加到文件非常相似。我编写了一个简单的脚本来执行系统命令,如果存在诸如“ ls”,“ date”等单个单词,该脚本就可以很好地工作。但是如果命令大于此范围,则程序将死亡。
以下是代码
package main import ( "fmt" "os/exec" "sync" ) func exe_cmd(cmd string, wg *sync.WaitGroup) { fmt.Println(cmd) c = cmd.Str out, err := exec.Command(cmd).Output() if err != nil { fmt.Println("error occured") fmt.Printf("%s", err) } fmt.Printf("%s", out) wg.Done() } func main() { wg := new(sync.WaitGroup) wg.Add(3) x := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"} go exe_cmd(x[0], wg) go exe_cmd(x[1], wg) go exe_cmd(x[2], wg) wg.Wait() }
以下是我看到的错误
exec: "echo newline >> foo.o": executable file not found in $PATHexec: "echo newline >> f2.o": executable file not found in $PATHexec: "echo newline >> f1.o": executable file not found in $PATH
我想,这可能是由于未单独发送cmds和参数(http://golang.org/pkg/os/exec/#Command)导致的。我想知道如何颠覆这个问题,因为我不知道命令中将要执行多少个参数。
我找到了实现这一目标的相对体面的方法。
out, err := exec.Command("sh","-c",cmd).Output()
直到现在为我工作。仍在寻找更好的方法来实现这一目标。
编辑1:
最后,一个更简单,有效(到目前为止)的方法是这样的
func exe_cmd(cmd string, wg *sync.WaitGroup) { fmt.Println("command is ",cmd) // splitting head => g++ parts => rest of the command parts := strings.Fields(cmd) head := parts[0] parts = parts[1:len(parts)] out, err := exec.Command(head,parts...).Output() if err != nil { fmt.Printf("%s", err) } fmt.Printf("%s", out) wg.Done() // Need to signal to waitgroup that this goroutine is done }
多亏了go中各种各样的争论以及向我指出的人:)