LoginSignup
6
6

More than 5 years have passed since last update.

Goで標準出力と標準エラー出力の色情報を失わずに外部コマンドをラップする 

Last updated at Posted at 2016-08-13

こちら(Golangで外部コマンドを実行する方法まとめ
GoGo2109 - Qiita
)にGolangで外部コマンドを実行する方法や実行した結果を出力する方法がまとまっていますが、出力をプログラム上で文字列の返り値として受け取る方法だと出力時の色情報が失われてしまいます。

色情報を失わずに単純にコマンドをラップするには、cmd.Stdoutcmd.Stderros.Stdoutos.Stdoutに置き換えてからcmd.Run()を実行することで実現可能です。

package main

import (
    "os"
    "os/exec"
    "syscall"
)

func main() {
    args := os.Args[1:]
    cmd := exec.Command("ls", args...)
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    err := cmd.Run()
    if err != nil {
        status := 1
        if e2, ok := err.(*exec.ExitError); ok {
            if s, ok := e2.Sys().(syscall.WaitStatus); ok {
                status = s.ExitStatus()
            }
        }
        os.Exit(status)
    }
}

ステータスコードを厳密に外部コマンドから取得する必要がない場合には以下で十分です。

package main

import (
    "os"
    "os/exec"
)

func main() {
    args := os.Args[1:]
    cmd := exec.Command("ls", args...)
    cmd.Stdout = os.Stdout
    cmd.Stderr = os.Stderr

    err := cmd.Run()
    if err != nil {
        os.Exit(1)
    }
}

参考

6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6