检测bash脚本中的程序错误?

时间:2009-12-06 07:22:12

标签: bash ffmpeg

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

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

MP4Box
  • 我可以为第一个程序调用做一些try / catch,以确保MP4Box获得可行的输入吗?
  • 我是否应该为错误捕获而烦恼,我是否应该依靠程序本身来为我做这件事?

5 个答案:

答案 0 :(得分:6)

根据另一个程序的成功执行一个程序的一种快速方法是使用&&。 (以下命令都是伪代码)

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?

答案 1 :(得分:5)

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

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

答案 2 :(得分:1)

是的 - 您应该担心错误并且实际上并不是一个大问题 - 您需要做的就是检查您执行的应用程序的退出代码 - 如果一切顺利,应用程序应返回退出代码等于零 - 如果您还需要更多详细信息,请查看此处:http://tldp.org/LDP/abs/html/exit-status.html

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

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

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