为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
波斯汪 2023-06-19 15:58:17
在我的 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");but the result is that it exec acme.sh without parameters.
查看完整描述

2 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

使用此脚本作为 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" "-c",确保脚本有正确的 bang 行并依赖内核 binfmt 处理程序


查看完整回答
反对 回复 2023-06-19
?
偶然的你

TA贡献1841条经验 获得超3个赞

从 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))


查看完整回答
反对 回复 2023-06-19
  • 2 回答
  • 0 关注
  • 95 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信