93

go プログラムで 'ls' を実行し、結果を文字列に保存したいとしましょう。exec および os パッケージにはプロセスをフォークするコマンドがいくつかあるようですが、stdout などにはファイル引数が必要です。出力を文字列として取得する方法はありますか?

4

8 に答える 8

4

好みのパラダイムに応じて、次の 2 つのオプションがあります。

  1. os.ForkExec()
  2. exec.Run()
于 2009-12-10T04:28:21.260 に答える
3

exec.Runを使用して、stdoutにPipeを渡します。それが返すパイプから読み取ります。

于 2009-12-09T21:44:37.580 に答える
2

編集:この回答は廃止されました。以下の Fatih Arslan の回答をご覧ください。


Pipeを stdout (および必要に応じて stderr) として指定して、 exec.Runを使用します。これは、標準出力 (および標準エラー出力) フィールドに os.File含む cmd を返します。次に、たとえば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))
    }
}
于 2009-12-11T06:13:12.240 に答える
1

string出力が必要な場合は、 strings.Builder[1] よりも効率的です bytes.Buffer

package main

import (
   "os/exec"
   "strings"
)

func main() {
   c, b := exec.Command("go", "version"), new(strings.Builder)
   c.Stdout = b
   c.Run()
   print(b.String())
}
  1. https://golang.org/pkg/bytes#Buffer.String
于 2021-04-04T21:29:02.663 に答える