【问题标题】:Is there any way we can execute a multiple commands in exec.Command?有什么方法可以在 exec.Command 中执行多个命令?
【发布时间】:2019-07-02 04:34:24
【问题描述】:

我正在尝试使用 exec.Command() 在 Go 中执行一组命令。我正在尝试使用 Docker Exec 分离 Gluster 对等体。

fmt.Println("About to execute gluster peer detach")

SystemdockerCommand := exec.Command("sh", "-c", "docker exec ", "9aa1124", " gluster peer detach ", "192.168.1.1", " force")
var out bytes.Buffer
var stderr bytes.Buffer
SystemdockerCommand.Stdout = &out
SystemdockerCommand.Stderr = &stderr
err := SystemdockerCommand.Run()
if err != nil {
    fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
}
fmt.Println("System Docker exec : " + out.String())

我期待的结果是“没有可分离的同伴”。但是得到了 退出状态 1:“docker exec”至少需要 2 个参数。

【问题讨论】:

  • 您似乎只想执行带有一些参数的单个命令docker。或者第二个命令是哪个?!
  • 您可以通过多次调用exec.Command 来使用exec.Command 执行多个命令。如果您尝试在命令之间传输数据,例如在 shell 中,您必须手动执行此操作。但是我没有看到任何证据表明您甚至试图执行两个命令,更不用说将它们连接在一起了。你的实际问题是什么?
  • 什么时候我会尝试执行。输出:退出状态 127:docker exec 需要至少 2 个参数
  • 所以传递两个参数。这与两个命令无关。

标签: go


【解决方案1】:

既然你用过sh -c,那么下一个参数应该是完整的一个或多个命令:

SystemdockerCommand := exec.Command("sh", "-c", "docker exec 9aa1124 gluster peer detach 192.168.1.1 force")

更一般地说,as in here

cmd := exec.Command("/bin/sh", "-c", "command1 param1; command2 param2; command3; ...")
err := cmd.Run()       

this example:

sh := os.Getenv("SHELL") //fetch default shell
//execute the needed command with `-c` flag
cmd := exec.Command(sh, "-c ", `docker exec 9aa1124 ...`)

或者this one,先把你的命令放在一个字符串中:

cmd := "cat /proc/cpuinfo | egrep '^model name' | uniq | awk '{print substr($0, index($0,$4))}'"
out, err := exec.Command("bash","-c",cmd).Output()
if err != nil {
    return fmt.Sprintf("Failed to execute command: %s", cmd)
}

【讨论】:

  • 输出:退出状态 127:docker exec 需要至少 2 个参数
  • @sampatnayak 如果您复制粘贴了我的答案,我已经删除了额外的双引号。我还添加了另一个示例。
【解决方案2】:

有什么方法可以在 exec.Command 中执行多个命令

没有。

【讨论】:

    猜你喜欢
    • 2021-12-09
    • 2021-01-18
    • 1970-01-01
    • 2021-04-03
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    相关资源
    最近更新 更多