我正在尝试编写我的第一个半高级bash脚本,该脚本将以文件名的形式输入引用avi
视频,将其发送到ffmpeg
以转换为{{1 (保留原始名称)然后将其移交给mp4
。
以下几乎就是我正在做的事情......
MP4Box
答案 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 variable和How 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行之后你可以检查“$?”反对非零值并退出错误。