6
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?