Domanda

Diciamo che voglio correre 'ls' in un programma di andare, e memorizzare i risultati in una stringa. Sembra che ci sia alcuni comandi alla tavola processi nei pacchetti exec e os, ma richiedono argomenti di file per stdout, ecc C'è un modo per ottenere il risultato come una stringa?

È stato utile?

Soluzione

Modifica Questa risposta è obsoleto. Si prega di consultare la risposta di Fatih Arslan di seguito.


exec.Run specificando Tubazioni come stdout (e stderr se volete). Si tornerà cmd, che contiene un os.File nei campi STDOUT (e stderr) . Poi si può leggere usando per esempio ioutil.ReadAll .

Esempio:

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))
    }
}

Altri suggerimenti

C'è un modo più semplice ora:

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)
}

Dove out è l'uscita standart. E 'nel formato []byte, ma si può cambiare a stringa facilmente con:

string(out)

È inoltre possibile utilizzare CombinedOutput() invece di Output() che restituisce lo standard output e lo standard error.

exec.Command

Per ottenere sia stdout e stderr in stringhe separate, è possibile utilizzare i buffer di byte in questo modo:

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())

Due opzioni, a seconda del paradigma che preferite:

  1. os.ForkExec ()
  2. exec.Run ()

Ho usato questo con una versione recente di 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 , passando Tubo per stdout. Leggere dal tubo che restituisca.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top