Go 如何隐藏终端命令的输出

Go 如何隐藏终端命令的输出,go,Go,我有一个复杂的ffmpeg命令要执行,我需要使用Go执行。命令正在工作,当我尝试使用/dev/null 2>&1 这是我的代码: cmd := exec.Command( "ffmpeg", "-y", "-loglevel", "warning", "-i", ConvertImage, "-i", videoInput, "-c:v", cv, "-c:a", audioCodec, "-crf", fmt.Sprintf("%

我有一个复杂的
ffmpeg
命令要执行,我需要使用Go执行。命令正在工作,当我尝试使用
/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",
)
如果没有最后一个字段
“>/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,
)

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

err := cmd.Run()
if err != nil {
    fmt.Println("Cannot Execute cmd: ", err.Error())
}
这样,输出和错误都在相应的缓冲区中

现在,如果要打印它们,可以将以下代码段与上述代码一起使用:

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.stdout
cmd.stderr
设置为
nil
,如下所示:

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
cmd.Stdout = nil
cmd.Stderr = nil

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

此外,如文件所述,可以设置为
nil
,以重定向到空设备。有些命令可能会向stdout和/或stderr写入大量状态,如果您不需要它,也不打算查看它,则不应该对其进行缓冲。还要注意,
ffmpeg
有一个
-loglevelquiet
选项。