如何隐藏终端命令的输出

时间:2019-08-21 16:18:51

标签: go

我有一个复杂的ADD TRANDATA SCHEMA.TABLE命令要执行,我需要使用Go执行。该命令正在运行,当我尝试使用ffmpeg

隐藏命令的输出时,问题就来了

这是我的代码:

> /dev/null 2>&1

当我尝试隐藏命令的输出(不运行时跳过命令)时,没有最后一个字段cmd := exec.Command( "ffmpeg", "-y", "-loglevel", "warning", "-i", ConvertImage, "-i", videoInput, "-c:v", cv, "-c:a", audioCodec, "-crf", fmt.Sprintf("%d", crf), "-map", "[v]", "-map", "1:a?", "-r", fmt.Sprintf("%d", Res.FrameRate), "-strict", "-2", outputFile, "> /dev/null 2>&1", ) 的代码工作正常。

我做错了什么?我该如何解决?

1 个答案:

答案 0 :(得分:1)

您可以简单地将输出放入bytes.Buffer变量,如下所示:

cmd := exec.Command(
    "ffmpeg",
    "-y",
    "-loglevel", "warning",
    "-i", ConvertImage,
    "-i", videoInput,
    "-c:v", cv,
    "-c:a", audioCodec,
    "-crf", fmt.Sprintf("%d", crf),
    "-map", "[v]",
    "-map", "1:a?",
    "-r", fmt.Sprintf("%d", Res.FrameRate),
    "-strict",
    "-2",
    outputFile,
)

var execOut bytes.Buffer
var execErr bytes.Buffer
cmd.Stdout = &execOut
cmd.Stderr = &execErr

这样做,输出和错误都在相应的缓冲区中。

现在,如果要打印它们,则可以使用以下代码片段以及上面的代码:

err := cmd.Run()
if err != nil {
    fmt.Println("Cannot Execute cmd: ", err.Error())
}
outStr := execOut.String()
errStr := execErr.String()
if len(outStr) > 0 {
    fmt.Print(outStr)
}
if len(errStr) > 0 {
    fmt.Print(errStr)
}

更新:或者,如果您完全不需要stdout和stderr,则可以将cmd.Stdoutcmd.Stderr设置为nil,如下所示:

cmd.Stdout = nil
cmd.Stderr = nil

err := cmd.Run()
if err != nil {
    fmt.Println("Cannot Execute cmd: ", err.Error())
}