こちら(Golangで外部コマンドを実行する方法まとめ
GoGo2109 - Qiita)にGolangで外部コマンドを実行する方法や実行した結果を出力する方法がまとまっていますが、出力をプログラム上で文字列の返り値として受け取る方法だと出力時の色情報が失われてしまいます。
色情報を失わずに単純にコマンドをラップするには、cmd.Stdout
とcmd.Stderr
をos.Stdout
とos.Stdout
に置き換えてからcmd.Run()
を実行することで実現可能です。
- 終了ステータスコードを外部コマンドから適切に取得するバージョン https://play.golang.org/p/bPdEsY_DLh
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)
}
}
- 終了ステータスコードを簡易版 https://play.golang.org/p/jOBan0jznK
ステータスコードを厳密に外部コマンドから取得する必要がない場合には以下で十分です。
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)
}
}