如何使用 Go 在命令行上执行 diff?

我在使用 Ubuntu 14.04 并diff在命令行上执行时遇到问题。看下面的 Go 代码:


package main


import "fmt"

import "log"

import "os/exec"


func main() {

    output, err := exec.Command("diff", "-u", "/tmp/revision-1", "/tmp/revision-4").Output()

    if err != nil {

        log.Fatalln(err)

    }


    fmt.Println(string(output))

}

如果我使用它执行此操作,go run test.go则会出现以下错误:


2015/03/18 14:39:25 exit status 1

exit status 1

所以出了点问题,diff它1作为退出代码返回。只有diff命令似乎会引发错误。如果我使用catorwc命令,代码运行良好。


任何想法为什么diff在这里不起作用但其他命令可以?


弑天下
浏览 274回答 1
1回答

aluckdog

使用 运行程序时exec,如果退出代码不为 0,则会出现错误。来自文档:如果命令运行,复制 stdin、stdout 和 stderr 没有问题,并以零退出状态退出,则返回的错误为零。如果命令无法运行或未成功完成,则错误类型为 *ExitError。对于 I/O 问题,可能会返回其他错误类型。所以这里发生的事情是当文件不同时 diff 返回一个错误,但你把它当作一个运行时错误。只需更改您的代码以反映它不是。通过检查错误是可能的。例如这样的事情:    output, err := exec.Command("diff", "-u", "/tmp/revision-1", "/tmp/revision-4").CombinedOutput()    if err != nil {                   switch err.(type) {        case *exec.ExitError:            // this is just an exit code error, no worries            // do nothing        default: //couldnt run diff            log.Fatal(err)        }    }此外,我已经更改了 get CombinedOutput,因此如果发生任何特定于差异的错误,您也会看到 stderr 。请注意,即使其中一个文件不存在,您也会收到“有效”错误。因此,您可以ExitError通过执行以下操作来检查的退出代码:    switch e := err.(type) {    case *exec.ExitError:        // we can check the actual error code. This is not platform portable         if status, ok := e.Sys().(syscall.WaitStatus); ok {            // exit code 1 means theres a difference and is not an error            if status.ExitStatus() != 1 {                 log.Fatal(err)            }        }
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go