来自exec cmd的不稳定结果

时间:2018-02-18 20:37:30

标签: go

我正在Go中迈出第一步。我有一个cli命令,暂时只需删除并使用go和Postgres dropdb + createdb工具重新创建数据库。

以下代码会产生不一致的结果。结帐功能打印或不打印“out”字节变量。

我怀疑某些竞争条件,我应该在某处使用指针,而不是将值传递给同一个函数。

这段代码不好吗?

func ensurepath(command string) string {
    ensuredcommand, LookErr := exec.LookPath(command)
    if LookErr != nil {
        log.Fatalf("%v is not found", command)
    }
    log.Printf("ensure path for command '%v' : %v", command, ensuredcommand)
    return command
}

// warning : cmd error message is also a "out" value, it is not in err
func checkout(err error, out []byte) {
    if err != nil {
        log.Printf("command error %v : %s", err, out)
    } else {
        log.Printf("command result %T : %s", out, out)
    }
}

var restore = cli.Command{
    Name:    "restore",
    Aliases: []string{"r"},
    Usage:   "restore backup",
    Action: func(c *cli.Context) error {
        cmdArgs := "devdb"
        dropDB := ensurepath("dropdb")
        createDB := ensurepath("createdb")

        outErrDrop, err := exec.Command(dropDB, cmdArgs).CombinedOutput()
        checkout(err, outErrDrop)

        outErrCreate, createErr := exec.Command(createDB, cmdArgs).CombinedOutput()
        checkout(createErr, outErrCreate)

        return nil
    },
}

修改

奇怪的输出示例

如果我对“createDB”部分对应的行进行注释,这意味着我只删除了数据库,我有一个一致的预期输出。

var restore = cli.Command{
    Name:    "restore",
    Aliases: []string{"r"},
    Usage:   "restore backup",
    Action: func(c *cli.Context) error {
        cmdArgs := "devdb"
        dropDB := ensurepath("dropdb")
        //createDB := ensurepath("createdb")

        outErrDrop, err := exec.Command(dropDB, cmdArgs).CombinedOutput()
        checkout(err, outErrDrop)

        //outErrCreate, createErr := exec.Command(createDB, cmdArgs).CombinedOutput()
        //checkout(createErr, outErrCreate)

        return nil
    },
} 
//output
2018/02/19 15:49:44 ensure path for command 'dropdb' : /usr/local/bin/dropdb
2018/02/19 15:49:44 command error exit status 1 : dropdb: database removal failed: ERROR:  database "devdb" does not exist

但是如果引回对应于createdb部分的行(与我上面的第一个代码块完全相同),我得到以下结果:

2018/02/19 15:53:11 ensure path for command 'dropdb' : /usr/local/bin/dropdb
2018/02/19 15:53:11 ensure path for command 'createdb' : /usr/local/bin/createdb
2018/02/19 15:53:11 command result []uint8 :
2018/02/19 15:53:11 command result []uint8 :

0 个答案:

没有答案