Как выполнить встроенную команду оболочки

Я пытаюсь выяснить, существует ли программа в Linux, и я нашел этот статья. Я попытался выполнить это из моей программы go, и она продолжает выдавать мне ошибку, говоря, что не может найти «команду» в моем $ PATH, чего и следовало ожидать, поскольку это встроенная команда в Linux, а не двоичный файл. Итак, мой вопрос: как выполнять встроенные команды Linux из программ Go?

exec.Command("command", "-v", "foo")

ошибка: exec: "command": исполняемый файл не найден в $PATH


person Konoha    schedule 11.12.2015    source источник


Ответы (2)


Как говорится в этой статье, «команда» — это встроенная оболочка. Вы можете сделать это изначально через exec.LookPath.

Если необходимо, вы можете либо использовать системный двоичный файл which, либо выполнить command из оболочки,

exec.Command("/bin/bash", "-c", "command -v foo")
person JimB    schedule 11.12.2015
comment
Для пользователей bash type предпочтительнее which (последнее — скрипт). - person Rick-777; 13.12.2015
comment
Также обратите внимание, что в этом году в bash была серьезная ошибка безопасности, хотя она была исправлена. Но если у вас есть выбор, предпочтите оболочку по умолчанию sh (обычно это Dash) для всех сценариев оболочки на стороне сервера. - person Rick-777; 13.12.2015
comment
Это сработало для меня, но вместо использования полного пути /bin/bash я просто использовал sh, как показано ниже, exec.Command(sh, -c, command -v foo), иначе я получал ошибку выхода 26/27 для большинства моих действий. . - person joe mwirigi; 16.04.2019

В качестве альтернативы, если это встроенная команда, которой не нужны параметры, вы можете сделать что-то вроде следующего:

package main

import (
    "fmt"
    "log"
    "os/exec"
)

func main() {
    out, err := exec.Command("uuidgen").Output()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("%s", out)
}

Это распечатает уникальный идентификатор, подобный следующему: 4cdb277e-3c25-48ef-a367-ba734ce407c1, точно так же, как вызов его непосредственно из командной строки.

person Chris Townsend    schedule 12.12.2015
comment
uuidgen не является встроенной командой оболочки. Встроенная команда, например. псевдоним, источник, чтение, printf и т. д. .org/software/bash/manual/html_node/ - person lyderic; 07.06.2018