Как да изпълним вградена команда в shell

Опитвам се да разбера дали съществува програма на Linux и намерих това статия. Опитах се да изпълня това от моята програма go и тя продължава да ми дава грешка, казвайки, че не може да намери „команда“ в моя $PATH, което може да се очаква, тъй като това е вградена команда в linux, а не двоична. Така че въпросът ми е как да изпълнявам вградени команди на linux от програмите go?

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

грешка: exec: "команда": изпълним файл не е намерен в $PATH


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


Отговори (2)


Точно както се казва в тази статия, "command" е вградена обвивка. Можете да направите това естествено в go чрез 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, команда -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 не е вградена команда в shell. Вградена команда е напр. псевдоним, източник, четене, printf и т.н. gnu .org/software/bash/manual/html_node/ - person lyderic; 07.06.2018