kurumi-bioの雑記帳

プログラミング、パソコン、ペット、 犬、お出かけ

初心者のGo言語 -32- <CombinedOutput,Environ,Output>

こんにちは、kurumi-bioです。
第3回目のexecパッケージ(標準ライブラリー)の学習です

環境

  • Windows
    OSバージョン:Windows11 Home 22H2
    Go言語のバージョン:go version go1.20 windows/amd64
  • Linux
    OSバージョン:openSUSE Leap 15.4
    Go言語のバージョン:go version go1.20.1 linux/amd64

CombinedOutput関数

func (c *Cmd) CombinedOutput() ([]byte, error)

関数の説明CombinedOutput はコマンドを実行し、その結合された標準出力と標準エラーを返します。

◆テストコード(printOut.go)

package main

import (
    "fmt"
    "os"
)

func main() {
    fmt.Fprint(os.Stdout, "stdout!")
    fmt.Fprint(os.Stderr, "stderr!")
}

コードの説明 標準出力に"stdout!"と出力し、標準エラー出力に"stderr!"と出力するプログラムです。
go build printOut.goでビルドして実行形式にしておきます。

◆テストコード(CombinedOutputTest.go)

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    cmd := exec.Command("./printOut.exe")
    b, e := cmd.CombinedOutput()
    if e != nil {
        fmt.Printf("err=%v\n", e)
    }
    fmt.Printf("[%s]\n", b)
}

コードの説明 先ほどのビルドで生成したprintOut.exeコマンドを実行し、結合された標準出力と標準エラーを出力するプログラムです。

◆実行結果(Windows)

実行結果の説明 標準出力と標準エラーが結合して出力されました。

Environ関数

func (c *Cmd) Environ() []string

関数の説明Environ は、現在構成されているコマンドが実行される環境のコピーを返します。

◆テストコード

package main

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

func main() {
    if len(os.Args) != 2 {
        os.Exit(1)
    }
    cmd := exec.Command(os.Args[1])
    s := cmd.Environ()
    for i, v := range s {
        fmt.Printf("Environ[%d]=[%s]\n", i, v)
    }
}

コードの説明 実行時のコマンド引数で指定したコマンドを実行し、環境を出力します。

◆実行結果(Windows)

実行結果の説明 存在しないコマンドを指定しましたが、環境が出力されました。

Output関数

func (c *Cmd) Output() ([]byte, error)

関数の説明出力はコマンドを実行し、その標準出力を返します。返されるエラーは通常、*ExitError 型です。 c.Stderr が nil の場合、Output は ExitError.Stderr を設定します。

◆テストコード

package main

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

func main() {
    if len(os.Args) != 3 {
        os.Exit(1)
    }

    var serr strings.Builder

    cmd := exec.Command(os.Args[1], os.Args[2])
    cmd.Stderr = &serr

    o, e := cmd.Output()
    if e != nil {
        fmt.Fprintf(os.Stderr, "ERROR=[%v]\n", e)
        fmt.Printf("stderr=[%s]\n", serr.String())
    }
    fmt.Printf("o=[%s]\n", o)
}

コードの説明 実行時のコマンド引数で指定したコマンドを実行し、戻り値の標準出力の内容を出力します。
エラーが発生した場合は、エラー内容とcmd.stderrの内容を出力します。

◆実行結果(Windows)

実行結果の説明 goコマンドにコマンドライン引数versionを渡して実行しました。
標準出力に渡されたgoコマンドの実行結果のバージョン番号が出力されました。

◆実行結果(Windows)

実行結果の説明 存在しないコマンドgo1コマンドライン引数versionを渡して実行しました。
cmd.Output関数の戻り値errの値がexecutable file not found in %PATH%(%PATH%に実行可能ファイルが見つかりません)になりました。

◆実行結果(Windows)

実行結果の説明 goコマンドに存在しないコマンドライン引数verを渡して実行しました。
cmd.Output関数の戻り値errの値がexit status 2になり、
cmd.Stderrgoコマンドのエラーgo ver: unknown commandが出力されました。

最後までご覧いただきありがとうございます