在Bash脚本中检测程序错误?

4

我正在尝试编写我的第一个半高级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获得可操作的输入?
  • 我是否应该完全不担心错误捕获,而应该依赖程序自己为我执行此操作?
5个回答

7

如果要让一个程序的执行依赖于另一个程序的成功,一种快速的方法是使用 &&。(下面的命令都是伪代码)

first-cmd && second-cmd

在这种情况下,只有当第一个命令返回true时,才会执行第二个命令。
同样地,您可以使用||测试失败并采取适当的操作。
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

然后,您可以处理错误文本以获取更多信息,并在代码中进行条件操作。
参见:在变量中捕获输出如何将stderr重定向到管道?

6

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

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

1

是的 - 你应该关注错误,而且这并不是一个大问题 - 你需要做的就是检查你执行的应用程序的退出代码 - 通常情况下,如果一切顺利,应用程序应该返回一个等于零的退出代码 - 如果需要更多细节,请参考这里:http://tldp.org/LDP/abs/html/exit-status.html

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

1
你可以使用-e运行shell,或将set -e命令放入你的脚本中。这将导致脚本在任何命令返回非零退出状态时终止。
如果需要运行一个命令,而不想让非零退出导致脚本终止,请在该命令后添加|| true

0
如果ffmpeg表现良好,它将在成功时返回退出代码0,在失败时返回其他值。
"$?"是一个特殊的bash结构,用于告知上一个执行过程的返回代码。在ffmpeg行之后,您可以检查"$?"是否为非零值,并以错误退出。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接