【问题标题】:exec command with parameters in Go?Go中带参数的exec命令?
【发布时间】:2019-10-09 22:21:36
【问题描述】:

在我的 shell 中,我可以执行命令 acme.sh --issue --dns -d exmaple.com --yes-I-know-dns-manual-mode-enough-go-ahead-please 并获得输出。

现在我想在 go 中执行此操作,我的代码如下:

cmd := exec.Command("bash", "-c", "acme.sh --issue --dns -d exmaple.com --yes-I-know-dns-manual-mode-enough-go-ahead-please");
out, err := cmd.CombinedOutput()
if err != nil {
    log.Fatalf("issue failed with error: %s\n", err)
}
fmt.Printf("combined out:\n%s\n", string(out))

但我收到错误exit status 1

正如评论所说,我分开了论点:

exec.Command("bash", "-c", "acme.sh", "--issue", "--dns", "-d exmaple.com", "--yes-I-know-dns-manual-mode-enough-go-ahead-please");

但结果是它在没有参数的情况下执行acme.sh

【问题讨论】:

  • 你的英语很好。感谢您更新问题。

标签: bash go command


【解决方案1】:

将此脚本用作 acme.sh

#!/bin/bash

echo "$*"

与在同一目录中给出的程序发生您报告的错误

但是,如果我将当前目录添加到 shell PATH

export PATH=.:$PATH

然后程序按预期执行,就我的版本而言

$ go run c.go 
combined out:
--issue --dns -d exmaple.com --yes-I-know-dns-manual-mode-enough-go-ahead-please

好的,当 bash -c 将单个字符串作为命令时就是这种情况(稍后会详细介绍)

​​>

如果命令是这样发出的

    cmd := exec.Command("acme.sh", "--issue", "--dns", "-d exmaple.com", "--
yes-I-know-dns-manual-mode-enough-go-ahead-please")

然后,随着对问题状态的后续编辑,命令 acme.sh 将在不带参数的情况下运行。

问题在于bash -c 的行为方式。

来自手册页

bash 解释以下选项时 被调用:

   -c        If the -c option is present, then commands are read from  the
             first non-option argument command_string.  If there are argu‐
             ments after the command_string,  they  are  assigned  to  the
             positional parameters, starting with $0.

在您的情况下,这意味着bash -c 的第一个参数被接受为命令。其他参数丢失了,因为它们是新 bash shell 的位置参数,而不是 acme.sh 命令的位置参数

有关bash -chttps://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c的更多详细信息,请参阅此内容

最后,在这种情况下我会做什么:跳过"bash" "-c",确保脚本有正确的 bang line 并依赖内核 binfmt 处理程序

【讨论】:

    【解决方案2】:

    从 err 中排除 exit status 1 会得到正确的结果。

    cmd := exec.Command("bash", "-c", "acme.sh --issue --dns -d exmaple.com --yes-I-know-dns-manual-mode-enough-go-ahead-please");
    out, err := cmd.CombinedOutput()
    if err != nil && err.Error() != "exit status 1" {
        log.Fatalf("issue failed with error: %s\n", err)
    }
    fmt.Printf("combined out:\n%s\n", string(out))
    

    【讨论】:

      猜你喜欢
      • 2014-07-28
      • 2018-10-16
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2022-08-02
      • 2013-08-11
      • 2019-11-26
      • 2014-02-16
      相关资源
      最近更新 更多