【问题标题】:Detecting program errors in bash scripts?检测 bash 脚本中的程序错误?
【发布时间】:2010-12-23 16:50:26
【问题描述】:

我正在尝试编写我的第一个半高级 bash 脚本,它将以引用 avi 视频的文件名的形式接受输入,将其发送到 ffmpeg 以转换为 mp4(保留原始名称),然后将其交给MP4Box

以下就是我正在做的事情......

#!/usr/bin/bash
ffmpeg -i $0 -acodec libfaac -ab 128k -ac 2 -vcodec libx264 -vpre hq -crf 22 -threads 0 ($0).mp4
MP4Box -inter 500 ($0).mp4
  • 我可以为第一个程序调用执行某种 try/catch 以确保 MP4Box 获得可行的输入吗?
  • 我是否应该为错误捕获而烦恼,我应该依靠程序本身来为我做这件事吗?

【问题讨论】:

    标签: bash ffmpeg


    【解决方案1】:

    是的 - 你应该担心错误,这样做真的不是什么大问题 - 你需要做的就是检查你执行的应用程序的退出代码 - 通常,如果一切顺利,应用程序应该返回一个退出代码为零 - 如果您还需要更多详细信息,请查看此处:http://tldp.org/LDP/abs/html/exit-status.html

    lskdf      # Unrecognized command.
    echo $?    # Non-zero exit status returned because command failed to execute.
    

    【讨论】:

      【解决方案2】:

      如果 ffmpeg 是一个好公民,它将在成功时返回退出代码 0,在失败时返回一些其他值。

      “$?”是一个特殊的 bash 构造,它告诉最后执行的进程的返回码。 在 ffmpeg 行之后,您可以检查“$?”针对非零值并错误退出。

      【讨论】:

        【解决方案3】:

        总的来说,您可以检查返回码以确定命令的结果。您可以使用特殊变量$? 获取先前执行命令的返回码。请注意,它在每个命令之后都会更新,因此请使用它来设置另一个变量。例如RC = $?。返回码通常为 0 表示成功,非 0 表示失败。特定的非零返回代码可能指示特定类型的故障。检查您的命令的手册页以准确了解如何解释它们。获得返回代码后,您可以使用它进行分支。例如:

        ffmpeg <your args>
        RC=$?
        if [ "${RC}" -ne "0" ]; then
            # Do something to handle the error.
        else
            # Everything was ok.
        fi
        

        【讨论】:

          【解决方案4】:

          使一个程序的执行依赖于另一个程序的成功的一种快速方法是使用&amp;&amp;。 (以下命令均为伪代码)

          first-cmd && second-cmd
          

          在这种情况下,只有在 first-cmd 返回 true 时才会执行 second-cmd。

          同样,您可以使用|| 测试失败并采取适当的措施

          bad-cmd || echo "failed"
          

          您可以通过多种方式组合它们:

          good-cmd && echo "succeeded" || echo "failed"
          
          bad-cmd || {
              recovery-cmd || 
              echo "recovery failed && 
              echo "recovered"
          } 
          

          当然,使用其他人注意到的特殊变量$? 通常更清楚。

          您通常希望将错误消息重定向到 /dev/null 或将它们捕获到变量中。

          bad-cmd 2>/dev/null               # send error message to the bit bucket
          var=$(good-cmd)                   # capture stdout
          var=$(bad-cmd 2>&1)               # capture stdout and stderr
          var=$(bad-cmd 2>&1 >/dev/null)    # capture only stderr
          

          然后您可以处理错误的文本以获取代码中条件操作的附加信息。

          请参阅:Capture output in a variableHow can I redirect stderr to a pipe?

          【讨论】:

            【解决方案5】:

            您可以使用-e 运行shell,或者将命令set -e 放入您的脚本中。如果任何命令返回非零退出状态,这将导致脚本终止。

            如果您需要运行一个不希望非零退出导致脚本终止的命令,请将|| true 附加到该命令。

            【讨论】:

              猜你喜欢
              • 2021-08-11
              • 1970-01-01
              • 2011-02-14
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-03-13
              • 1970-01-01
              • 2012-09-08
              相关资源
              最近更新 更多