猿问

如何使用未知参数执行系统命令?

我有一堆系统命令,它们有点类似于将新内容附加到文件中。我写了一个简单的脚本来执行系统命令,如果有像 '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)。我想知道如何颠覆这一点,因为我不知道我的命令中有多少参数需要执行。


天涯尽头无女友
浏览 212回答 3
3回答

喵喔喔

因为exec.Command()第一个参数需要是可执行文件的路径。然后剩余的参数将作为参数提供给可执行文件。使用strings.Fields()以帮助分裂字为[]字符串。例子:package mainimport (    "fmt"    "os/exec"    "sync"    "strings")func exe_cmd(cmd string, wg *sync.WaitGroup) {    fmt.Println(cmd)            parts := strings.Fields(cmd)    out, err := exec.Command(parts[0],parts[1]).Output()    if err != nil {        fmt.Println("error occured")        fmt.Printf("%s", err)    }    fmt.Printf("%s", out)    wg.Done()}func main() {    wg := new(sync.WaitGroup)    commands := []string{"echo newline >> foo.o", "echo newline >> f1.o", "echo newline >> f2.o"}    for _, str := range commands {        wg.Add(1)        go exe_cmd(str, wg)    }    wg.Wait()}这是另一种方法,它只是将所有命令写入一个文件,然后在新创建的输出目录的上下文中执行该文件。示例 2package mainimport (    "os"    "os/exec"    "fmt"    "strings"    "path/filepath")var (    output_path = filepath.Join("./output")    bash_script = filepath.Join( "_script.sh" ))func checkError( e error){    if e != nil {        panic(e)    }}func exe_cmd(cmds []string) {    os.RemoveAll(output_path)    err := os.MkdirAll( output_path, os.ModePerm|os.ModeDir )    checkError(err)    file, err := os.Create( filepath.Join(output_path, bash_script))    checkError(err)    defer file.Close()    file.WriteString("#!/bin/sh\n")    file.WriteString( strings.Join(cmds, "\n"))    err = os.Chdir(output_path)    checkError(err)    out, err := exec.Command("sh", bash_script).Output()    checkError(err)    fmt.Println(string(out))}func main() {    commands := []string{    "echo newline >> foo.o",    "echo newline >> f1.o",    "echo newline >> f2.o",    }   exe_cmd(commands)}
随时随地看视频慕课网APP

相关分类

Go
我要回答