exec команда с параметрами в Go? - PullRequest
0 голосов
/ 23 мая 2019

В моей оболочке я могу выполнить команду 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 ]

1 голос
/ 23 мая 2019

Использование этого скрипта в качестве acme.sh

#!/bin/bash

echo "$*"

с программой, указанной в том же каталоге, возникает ошибка, о которой вы сообщаете

Однако, если я добавлю текущий каталог в оболочку 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, а не для команды acme.sh

См. Это для более подробной информации о bash -c https://unix.stackexchange.com/questions/144514/add-arguments-to-bash-c

Наконец, что бы я сделал в этой ситуации: пропустите "bash" "-c", убедитесь, что сценарий имеет правильную строку взрыва, и положитесь на обработчик ядра binfmt

0 голосов
/ 23 мая 2019

исключить exit status 1 из err, чтобы получить правильный результат.

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...