使用Go语言封装外部命令,同时保持标准输出和标准错误输出的颜色信息
在这篇文章(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)
    }
}
请参阅
- 
- Golangで外部コマンドを実行する方法まとめ
 
- 
- GoGo2109 – Qiita
 
- Goでコマンドを実行して終了コードを取得する方法 – Qiita
 
    