いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-140 (exec.Command で標準入力・標準出力・標準エラー出力を全部指定)

概要

よく忘れるのでメモメモ。

少し前に exec.Command について以下をメモしていました。

devlights.hatenablog.com

devlights.hatenablog.com

上の記事では 標準出力と標準エラー出力を (Cmd).Output() や (Cmd).CombinedOutput() を指定して取得していました。

Cmd構造体には、Stdin, Stdout, Stderr というフィールドが公開されていますので、ここに直接指定することもできます。

サンプル

package cmdexec

import (
    "bytes"
    "errors"
    "io"
    "os/exec"
    "runtime"
    "strings"

    "github.com/devlights/gomy/output"
)

// Stdinouterr は、標準入力・標準出力・標準エラー出力を指定してコマンドを実行するサンプルです。
//
// REFERENCES:
//   - https://golang.org/pkg/os/exec/#example_Command
func Stdinouterr() error {
    if runtime.GOOS == "windows" {
        return errors.New("this example cannot run on Windows, sorry")
    }

    const (
        Shell = "/bin/bash"
    )

    var (
        cmd *exec.Cmd                                     // コマンド
        fd0 io.Reader = strings.NewReader("hello\nworld") // 標準入力
        fd1 io.Writer = &bytes.Buffer{}                   // 標準出力
        fd2 io.Writer = &bytes.Buffer{}                   // 標準エラー出力
        err error                                         // エラー
    )

    cmd = exec.Command(Shell, "-c", "tr a-z A-Z; echo ..done.. 1>&2")

    // 標準入力・標準出力・標準エラー出力を設定
    cmd.Stdin = fd0
    cmd.Stdout = fd1
    cmd.Stderr = fd2

    // 実行
    err = cmd.Run()
    if err != nil {
        return err
    }

    output.Stdoutf("[Stdout]", "\n%s\n", fd1)
    output.Stdoutf("[Stderr]", "\n%s\n", fd2)

    return nil
}

try-golang/stdinouterr.go at master · devlights/try-golang · GitHub

実行すると以下のようになります。

gitpod /workspace/try-golang $ make run

go get -d ./...
go run -race github.com/devlights/try-golang/cmd/trygolang -onetime -example ""

ENTER EXAMPLE NAME: cmdexec_stdinouterr
[Name] "cmdexec_stdinouterr"

[Stdout]             
HELLO
WORLD
[Stderr]             
..done..

[Elapsed] 3.902221ms

ちゃんとそれぞれ取得できていますね。

参考資料

golang.org


過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com

github.com