Почему некоторые команды возвращают вывод, а другие нет для exec.Command()

Я пытаюсь понять, почему некоторые команды оболочки работают с goloang exec.Command, а другие нет, когда все они возвращают один и тот же результат при вводе в терминал. В основном я хотел бы использовать одну и ту же команду для двоичных файлов Windows и Mac (exec.Command("where", "go").Output()).

В частности:

goInstalled, err := exec.Command("where", "go").Output() // does not return output on mac when compiled but does in terminal command. DOES return output on windows compiled.

goInstalled, err := exec.Command("which", "go").Output() // does not return output on mac when compiled but does in terminal command

goInstalled, err := exec.Command("command", "-v", "go").Output() // returns output when compiled and as terminal command (mac only)

Я хотел бы использовать одну и ту же команду для Windows и Mac (darwin), если это возможно, вместо того, чтобы создавать две отдельные функции, чтобы проверять, установлены ли что-то на компьютере пользователя.


person Steve    schedule 09.01.2019    source источник
comment
Вы, должно быть, игнорируете err.   -  person hobbs    schedule 10.01.2019
comment
под отсутствием вывода я подразумеваю, что он запускает блок err != nil, и значение [] для goInstalled для них. goInstalled, err := exec.Command(command, -v, go).Output() не запускает блок err != nil и возвращает вывод [номера байтов]   -  person Steve    schedule 10.01.2019
comment
exec.Command не выполняет команды оболочки. Он выполняет программу, указанную в качестве первого аргумента. Встроенные оболочки не работают без явного запуска оболочки. В этом случае вы можете просто вызвать exec.LookPath.   -  person Peter    schedule 10.01.2019


Ответы (1)


Основная проблема, с которой вы здесь столкнулись, заключается в том, что exec.Command выполняет программы, где команды, которые вы пытаетесь использовать, на самом деле являются встроенными.

Чтобы использовать встроенные модули, вам нужно найти их с помощью exec.LookPath, и они обычно недоступны вне оболочки.

При необходимости вы также можете выполнить команду внутри оболочки, указав оболочку в качестве первого аргумента:

exec.Command("/bin/bash", "-c", "command -v foo")
person syntaqx    schedule 10.01.2019
comment
Не нужно вызывать LookPath самостоятельно: если имя не содержит разделителей пути, Command использует LookPath для преобразования имени в полный путь golang.org/pkg/os/exec/#Command - person Peter; 10.01.2019
comment
Моя ошибка, я обновлю свой комментарий. Спасибо за улов! - person syntaqx; 10.01.2019