带有Go中参数的exec命令?

时间:2019-05-23 10:48:35

标签: bash go command

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

现在我想随身携带,代码如下:

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而没有参数。

2 个答案:

答案 0 :(得分:2)

将此脚本用作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的第一个arg被接受为命令。其他参数丢失,因为它们是新bash shell而不是acme.sh命令的位置args

有关bash -c https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c

的更多详细信息,请参见此

最后,在这种情况下,我该怎么做:跳过"bash" "-c",确保脚本具有正确的爆炸行并依靠内核binfmt处理程序

答案 1 :(得分:0)

从错误中排除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))