bash - 在 Go 中执行带有参数的命令?

标签 bash go command

在我的 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-我知道 dns-manual-mode-enough-go-ahead-please");

但结果是不带参数执行acme.sh

最佳答案

将此脚本用作 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 interprets the following options when it is invoked:

   -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 -c 的更多详细信息,请参见此处 https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c

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

关于bash - 在 Go 中执行带有参数的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56273586/

相关文章:

bash - 在 bash "for"循环中排序

bash - 在临时文件夹中运行脚本

parsing - 为什么 go 使用本地位置而不是 UTC 解析我的时间戳

silverlight - 如何在Enter键上激活按钮的Click命令?

c++ - 在 Qt 中以 root 身份执行 Linux 命令

bash - 如何在 awk 中解析包含逗号的带引号字段的 CSV 文件?

go - 正则表达式查找中文 unicode 字符

heroku - 在 Heroku 上使用 Imagemagick 部署 Go 应用程序

docker - 更改 k8s Pod 的入口点,但保留 CMD

bash - 最短的非空 bash quine