こんにちは、kurumi-bioです。
第2回目の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
Cmd型
type Cmd struct { // Path は、実行するコマンドのパスです。 Path string // Args は、コマンドを Args[0] として含むコマンド ライン引数を保持します。 Args []string // Env は、プロセスの環境を指定します。 Env []string // Dir は、コマンドの作業ディレクトリを指定します。 Dir string // Stdin は、プロセスの標準入力を指定します。 Stdin io.Reader // Stdout と Stderr は、プロセスの標準出力とエラーを指定します。 Stdout io.Writer Stderr io.Writer // ExtraFiles は、新しいプロセスによって継承される追加のオープン ファイルを指定します。 ExtraFiles []*os.File // SysProcAttr は、オプションのオペレーティング システム固有の属性を保持します。 SysProcAttr *syscall.SysProcAttr // Process は、いったん開始されると、基礎となるプロセスです。 Process *os.Process // ProcessState には、終了したプロセスに関する情報が含まれています ProcessState *os.ProcessState // LookPath エラー (存在する場合)。 Err error Cancel func() error WaitDelay time.Duration }
Command関数
func Command(name string, arg ...string) *Cmd
◆テストコード
package main import ( "errors" "fmt" "os" "os/exec" "strings" ) func main() { if len(os.Args) != 3 { os.Exit(1) } var sout, serr strings.Builder c := exec.Command(os.Args[1], os.Args[2]) c.Stdout = &sout c.Stderr = &serr e := c.Run() if e != nil { if errors.Is(e, exec.ErrDot) { fmt.Fprintln(os.Stderr, "ErrorDot") } else if errors.Is(e, exec.ErrNotFound) { fmt.Fprintln(os.Stderr, "ErrNotFound") } else if errors.Is(e, exec.ErrWaitDelay) { fmt.Fprintln(os.Stderr, "ErrWaitDelay") } fmt.Fprintf(os.Stderr, "ERROR=[%v]\n", e) } fmt.Printf("stdout=[%s]\n", sout.String()) fmt.Printf("stderr=[%s]\n", serr.String()) }
◆実行結果(Windows)
次に少し手を加えてexec.Command
関数の戻り値Cmd
構造体の内容を表示するプログラムを作成します。
◆テストコード
package main import ( "fmt" "os" "os/exec" "strings" ) func writeCmd(c exec.Cmd) { fmt.Printf("Path=[%s]\n", c.Path) for i, v := range c.Args { fmt.Printf("Args[%d]=[%s]\n", i, v) } p := c.Process if p != nil { if p != nil { fmt.Printf("pid=[%d]\n", c.Process.Pid) } } } func main() { if len(os.Args) != 3 { os.Exit(1) } var sout, serr strings.Builder c := exec.Command(os.Args[1], os.Args[2]) c.Stdout = &sout c.Stderr = &serr e := c.Run() writeCmd(*c) if e != nil { fmt.Fprintf(os.Stderr, "ERROR=[%v]\n", e) } fmt.Printf("stdout=[%s]\n", sout.String()) fmt.Printf("stderr=[%s]\n", serr.String()) }
◆実行結果(Windows)
最後までご覧いただきありがとうございます