Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

こちら(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)
    }
}

参考

sonatard
組み込みC言語ネットワークスタック開発者からGoバックエンドエンジニアにジョブチェンジしました。 最近はTypeScript, React(Hooks), GraphQL, SwiftUIに夢中。
https://github.com/sonatard/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away