Как получить вывод системной команды в Go?

StackOverflow https://stackoverflow.com/questions/1877045

  •  18-09-2019
  •  | 
  •  

Вопрос

Допустим, я хочу запустить «ls» в программе go и сохранить результаты в строке.Кажется, в пакетах exec и os есть несколько команд для разветвления процессов, но им требуются файловые аргументы для стандартного вывода и т. д.Есть ли способ получить результат в виде строки?

Это было полезно?

Решение

Редактировать: Этот ответ устарел.Пожалуйста, посмотри Ответ Фатиха Арслана ниже.


Использовать exec.Run указав Трубка как стандартный вывод (и стандартный вывод, если хотите).Он вернет cmd, который содержит os.File в полях Stdout (и Stderr).Затем вы можете прочитать его, например, ioutil.ReadAll.

Пример:

package main

import (
    "exec";
    "io/ioutil";
)

func main() {
    if cmd, e := exec.Run("/bin/ls", nil, nil, exec.DevNull, exec.Pipe, exec.MergeWithStdout); e == nil {
        b, _ := ioutil.ReadAll(cmd.Stdout)
        println("output: " + string(b))
    }
}

Другие советы

Теперь есть более простой способ:

package main

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

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

Где out это стандартный вывод.Это в формате []byte, но вы можете легко изменить его на строку с помощью:

string(out)

Вы также можете использовать CombinedOutput() вместо Output() который возвращает стандартный вывод и стандартную ошибку.

exec.Команда

Чтобы получить как stdout, так и stderr в отдельные строки, вы можете использовать байтовые буферы следующим образом:

cmd := exec.Command("date")
var outb, errb bytes.Buffer
cmd.Stdout = &outb
cmd.Stderr = &errb
err := cmd.Run()
if err != nil {
    log.Fatal(err)
}
fmt.Println("out:", outb.String(), "err:", errb.String())

Два варианта, в зависимости от предпочитаемой вами парадигмы:

  1. ос.ForkExec()
  2. exec.Run()

Я использовал это с последней версией GO (~ 1.11).

// CmdExec Execute a command
func CmdExec(args ...string) (string, error) {

    baseCmd := args[0]
    cmdArgs := args[1:]

    log.Debugf("Exec: %v", args)

    cmd := exec.Command(baseCmd, cmdArgs...)
    out, err := cmd.Output()
    if err != nil {
        return "", err
    }

    return string(out), nil
}

// Usage:
// out, err := CmdExec("ls", "/home")

Использовать exec.Run, передавая Pipe в качестве стандартного вывода.Прочитайте из трубы, что он возвращается.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top