【问题标题】:How could I pass a dynamic set of arguments to Go's command exec.Command?如何将一组动态参数传递给 Go 的命令 exec.Command?
【发布时间】:2014-05-11 23:38:47
【问题描述】:

我在这里遇到了一个与传递给 Go 的 exec.Command 函数的参数有关的问题,我想知道是否有办法动态传递这些参数?以下是 sed 问题的一些示例代码:

package main

import "os/exec"

func main() {
    app := "echo"
    //app := "buah"

    arg0 := "-e"
    arg1 := "Hello world"
    arg2 := "\n\tfrom"
    arg3 := "golang"

    cmd := exec.Command(app, arg0, arg1, arg2, arg3)
    out, err := cmd.Output()

    if err != nil {
        println(err.Error())
        return
    }

    print(string(out))
}

如您所见,每个 arg 都在上面定义为 arg0arg1arg2arg3。它们与要运行的实际命令(在本例中为 app var)一起传递给 Command 函数。

如果我有一个参数数组,而这些参数可能总是具有我想要传递的不确定计数,那会怎样。这可能吗?

【问题讨论】:

标签: go command exec


【解决方案1】:

像这样:

args := []string{"what", "ever", "you", "like"}
cmd := exec.Command(app, args...)

查看 golang.org 上的语言和教程。

【讨论】:

    【解决方案2】:

    您可以尝试使用对我有用的flag library。这是一个不同的示例,但它使用了接受动态参数的概念。

    package main
    
    import (
        "flag"
        "log"
        "os/exec"
        "strings"
    )
    func main() {
            flag.Parse()    
            arg1, arg2 := strings.Join(flag.Args()[:1], " "), strings.Join(flag.Args()[1:], " ")
            cmd := exec.Command(arg1, arg2)
            err := cmd.Start()
            if err != nil {
                log.Fatal(err)
            }
            log.Printf("Waiting for command to finish...")
            log.Printf("Process id is %v", cmd.Process.Pid)
            err = cmd.Wait()
            log.Printf("Command finished with error, now restarting: %v", err)
    }
    

    然后像这样跑

    $ go run main.go node ../web-test/index.js
    2019/01/26 13:32:29 Waiting for command to finish...
    2019/01/26 13:32:29 Process id is 3582
    

    【讨论】:

      【解决方案3】:

      有两种方法,

      1. command-line-flags
      2. 使用配置文件。程序将读取此文件并进行一些初始化或获取一些参数等。

      配置文件示例。

      // manifest.json
      {
        "name": "xxx",
        "version": "0.0.0",
        "server": {
          "port": 8080
        }
      }
      
      
      package main
      
      import (
          "encoding/json"
          "fmt"
          "io/ioutil"
          "os"
      )
      
      var (
          Config Settings
      )
      
      type Settings struct {
          Name    string `json:"name"`
          Version string `json:"version"`
          Server  Server `json:"server"`
      }
      
      type Server struct {
          Port int `json:"port"`
      }
      
      func LoadConfig(path string, settings *Settings) {
          jsonFile, err := os.Open(path)
          if err != nil {
              fmt.Printf(`Unable to open the "%s": %v`, path, err)
          }
      
          manifestBytes, _ := ioutil.ReadAll(jsonFile)
          if err := json.Unmarshal(manifestBytes, &settings); err != nil {
              fmt.Printf("Unable to unmarshal json to struct (Settings): %v", err)
          }
      }
      
      func main() {
          LoadConfig("manifest.json", &Config)
          paras := []string{Config.Version, fmt.Sprintf("%d", Config.Server.Port)}
          print(paras)
          // cmd := exec.Command(Config.Name, paras...)
          // ...
      }
      

      【讨论】:

        猜你喜欢
        • 2016-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-04
        • 2021-05-27
        • 2019-02-03
        • 1970-01-01
        • 2010-09-11
        相关资源
        最近更新 更多