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

med*_*iev 3 bash ffmpeg

我正在尝试编写我的第一个半高级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
Run Code Online (Sandbox Code Playgroud)
  • 我可以为第一个程序调用做一些try/catch,以确保MP4Box获得可行的输入吗?
  • 我是否应该为错误捕捉而烦恼,我是否应该依靠程序本身来为我做这件事?

Pau*_*ce. 6

使用一种快速的方法来使一个程序的执行依赖于另一个程序的成功&&.(以下命令都是伪代码)

first-cmd && second-cmd
Run Code Online (Sandbox Code Playgroud)

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

同样,您可以测试失败并使用适当的操作 ||

bad-cmd || echo "failed"
Run Code Online (Sandbox Code Playgroud)

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

good-cmd && echo "succeeded" || echo "failed"

bad-cmd || {
    recovery-cmd || 
    echo "recovery failed && 
    echo "recovered"
} 
Run Code Online (Sandbox Code Playgroud)

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

您经常需要将错误消息重定向到/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
Run Code Online (Sandbox Code Playgroud)

然后,您可以处理错误的文本以获取代码中的条件操作的其他信息.

请参阅:捕获变量中的输出以及如何将stderr重定向到管道?


Tom*_*ing 5

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

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