使用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
广告
将在 10 秒后关闭
bannerAds