带有Go中参数的exec命令?

In my shell, I can exec command acme.sh --issue --dns -d exmaple.com --yes-I-know-dns-manual-mode-enough-go-ahead-please and get output.

now I want to do that in go, and my code like:

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
", err)
}
fmt.Printf("combined out:
%s
", string(out))

but I got error exit status 1.

and as the comment said, I separate argument:

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.

exclude exit status 1 from err will get right result.

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
", err)
}
fmt.Printf("combined out:
%s
", string(out))

Using this script as acme.sh

#!/bin/bash

echo "$*"

with the program as given in the same directory the error you report occurs

However, if I add the current directory to the shell PATH

export PATH=.:$PATH

Then the program executes as hoped for, in the case of my version

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

Ok so that's the case when the bash -c takes a single string as the command (more about that in a moment)

If the command is issued like this

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

Then as the later edits to your question state, the command acme.sh is run without arguments.

The problem is with the way that bash -c behaves.

From the man page

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.

In your case what this means is that the first arg to bash -c is accepted as a command. The other args are lost as they are positional args to the new bash shell and not to the acme.sh command

See this for more details on bash -c https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c

Lastly, what I would do in this situation: Skip the "bash" "-c", ensure that the script has a correct bang line and rely on the kernel binfmt handler