使用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