いろいろ備忘録日記

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

Goメモ-197 (*exec.Cmd 実行時に追加の環境変数を渡す)

概要

以下自分用のメモです。よく忘れるのでここにメモメモ。。。

外部コマンド実行時に追加の環境変数を指定したい場合がたまにあります。

その場合は (*exec.Cmd).Env に値を追加したスライスを再設定することで可能となります。

サンプル

package cmdexec

import (
    "errors"
    "os"
    "os/exec"
    "runtime"

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

// WithEnv -- *exec.Cmd 実行時に追加の環境変数を指定するサンプルです.
//
// REFERENCES
//  - https://dev.to/tobychui/quick-notes-for-go-os-exec-3ejg
func WithEnv() error {
    if runtime.GOOS == "windows" {
        return errors.New("this example cannot run on Windows, sorry")
    }

    const (
        Shell = "/bin/bash"
    )

    var (
        cmd *exec.Cmd
        out []byte
        err error
    )

    //
    // 環境変数の追加なし
    //
    cmd = exec.Command(Shell, "-c", "env | grep LANG")

    out, err = cmd.Output()
    if err != nil {
        return err
    }

    output.Stdoutf("[no append]", "\n%s\n", out)
    output.StdoutHr()

    //
    // 環境変数の追加あり
    //
    cmd = exec.Command(Shell, "-c", "env | grep LANG")
    cmd.Env = append(os.Environ(), "LANG2=Japanese")

    out, err = cmd.Output()
    if err != nil {
        return err
    }

    output.Stdoutf("[append   ]", "\n%s\n", out)
    output.StdoutHr()

    return nil
}

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

gitpod /workspace/try-golang (master) $ make run
go run -race main.go -onetime -example ""

ENTER EXAMPLE NAME: cmdexec_env

[Name] "cmdexec_env"
[no append]          
LANG=en_US.UTF-8

-------------------------------------------------- 
[append   ]          
LANG2=Japanese
LANG=en_US.UTF-8

-------------------------------------------------- 


[Elapsed] 4.883609ms

参考情報


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

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