我有一个复杂的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",
)
的代码工作正常。
我做错了什么?我该如何解决?
答案 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.Stdout
和cmd.Stderr
设置为nil
,如下所示:
cmd.Stdout = nil
cmd.Stderr = nil
err := cmd.Run()
if err != nil {
fmt.Println("Cannot Execute cmd: ", err.Error())
}