Программно и надежно получить путь к исполняемому файлу go в контейнере без 'which' с помощью Go - PullRequest
0 голосов
/ 27 февраля 2019

Как я могу получить путь к двоичному файлу go в контейнере, который не имеет which программно ?

Один из вариантов - выполнить which go следующим образом:

bytes, err := exec.Command("which", "go").Output()

Однако я бы не хотел зависеть от доступности which.Предоставляет ли go какой-либо встроенный механизм для извлечения этого, и если нет, то какова альтернатива, кроме того, что пользователь сам проходит путь?

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Со страницы руководства which:

, которая принимает один или несколько аргументов.Для каждого из своих аргументов он выводит полный путь к исполняемым файлам, которые были бы выполнены, если бы этот аргумент был введен в приглашении оболочки.Это делается путем поиска исполняемого файла или сценария в каталогах, перечисленных в переменной окружения PATH, с использованием того же алгоритма, что и bash (1).

Функция Go's os/exec.LookPath isочень близки к этой функциональности:

LookPath ищет исполняемый файл с именем в каталогах, названных переменной среды PATH.Если файл содержит косую черту, он пробуется напрямую, а PATH не используется.Результатом может быть абсолютный путь или путь относительно текущего каталога.

Используйте path/filepath.Abs, если вам нужен гарантированный абсолютный путь.

0 голосов
/ 27 февраля 2019

Я не ожидаю, что это будет лучший ответ, но это тот, который я только что нашел.Я надеялся на более специфичный для go, но в то же время type в linux является встроенным по умолчанию, доступным в bash и sh (alpine).

Вы можете проверитьСделайте это самостоятельно, запустив type type, что даст:

Тип - это встроенная оболочка

Использование в go будет выглядеть так:

b, err := exec.Command("type", "go").Output()

if err != nil {
    /* 'type' is not available on the O/S */
}

goPath := strings.TrimPrefix(strings.TrimSuffix(string(b), "\n"), "go is ")

Причина, по которой требуются функции Trim, заключается в том, что вывод будет выглядеть следующим образом:

go is / usr / local / go / bin / go \ n

Это не самый лучший способ сделать это, но он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...