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

如何隐藏终端命令的输出

如何隐藏终端命令的输出

Go
喵喵时光机 2023-07-17 13:58:47
我有一个复杂的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",代码工作正常,命令跳过而不运行。我做错了什么?我该如何修复它?
查看完整描述

1 回答

?
四季花海

TA贡献1811条经验 获得超5个赞

您可以简单地将输出放入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())

}


查看完整回答
反对 回复 2023-07-17
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

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