Скажем, я хочу запустить 'ls' в программе go и сохранить результаты в строке. Кажется, что есть несколько команд для процессов fork в пакетах exec и os, но им нужны аргументы файла для stdout и т.д. Есть ли способ получить вывод в виде строки?
Как вы получаете вывод системной команды в Go?
Ответ 1
Изменить: Этот ответ устарел. Пожалуйста, смотрите ответ Фатих Арслан ниже.
Используйте exec.Run, указав Pipe в качестве stdout (и stderr, если хотите). Он вернет 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))
}
}
Ответ 2
Теперь есть более простой способ:
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()
который возвращает стандартный вывод и стандартную ошибку.
Ответ 3
Чтобы получить как 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())
Ответ 4
Используйте exec.Run, передавая Pipe для stdout. Прочтите из трубы, которую он возвращает.
Ответ 5
Два варианта, в зависимости от выбранной вами парадигмы:
Ответ 6
Я использовал это с последней версией 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")