为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
弑天下 2021-09-21 20:47:16
我在使用 Ubuntu 14.04 并diff在命令行上执行时遇到问题。看下面的 Go 代码:package mainimport "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 1exit status 1所以出了点问题,diff它1作为退出代码返回。只有diff命令似乎会引发错误。如果我使用catorwc命令,代码运行良好。任何想法为什么diff在这里不起作用但其他命令可以?
查看完整描述

1 回答

?
aluckdog

TA贡献1847条经验 获得超7个赞

使用 运行程序时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)

            }

        }


查看完整回答
反对 回复 2021-09-21
  • 1 回答
  • 0 关注
  • 265 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信