![一种在 Bash 脚本中捕获 ffmpeg/avconv 错误输出的方法](https://linux22.com/image/1349807/%E4%B8%80%E7%A7%8D%E5%9C%A8%20Bash%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E6%8D%95%E8%8E%B7%20ffmpeg%2Favconv%20%E9%94%99%E8%AF%AF%E8%BE%93%E5%87%BA%E7%9A%84%E6%96%B9%E6%B3%95.png)
我正在尝试批量转换一堆文件,并将转换后的文件简单列出为文本文档,以便我可以停止脚本并从大约开始的地方继续。
#! /bin/sh
source_dir="/home/eldamar/video"
find $source_dir -type f -regex ".*/.*\.\(mov\|mpg\|mkv\|avi\|m2v\|wmv\|flv\|m2ts\|vob\)" | {
while read file
do
ext=${file##*.}
filename=${file##*/}
basename=${filename%.*}
dirname=${file%/*}
touch converted.txt
if grep -Fxq "$filename" converted.txt
then
echo "$(tput setaf 2)File "$filename" is allready converted, ignoring it :D$(tput setaf 7)"
else
# Extract subtitles for mkv files
echo $ext
if [ "$ext"=="mkv" ]; then
# input.srt <- default subtitle
# input.lang.srt <- other languages
$sublang=""
mkvinfo=$(mkvinfo $file | grep subtitles -B3 -A3)
# Replace existing .srt
# rm $dirname/$basename.srt
# Extract subtitle from mkv
# mkvextract tracks input.mkv -c ISO8859-1 3:$dirname/$basename.$sublang.srt
fi
avconv -y -i $file -map 0 -map -0:s -vcodec libx264 -acodec libfaac $dirname/$basename.mp4
# Store the filename in list
echo $filename >> converted.txt
fi
done;
}
好了,字幕提取也正在进行中,但我不知道 avconv 是否失败,有办法吗?
编辑这个脚本现在已经完成了,如下所示http://pastebin.com/trMDRaq5谢谢您的帮助!
答案1
如果发生错误,大多数命令都会返回非零返回值。您可以捕获该返回代码,也可以使用||
和对其进行操作&&
。
例子:
avconv -y -i file1 ; echo command finished
avconv -y -i file1 && echo command finished successfully.
avconv -y -i file1 || echo command finished but indicated failure!
[编辑]
您也可以$?
在 shell 中检查。例如:
/bin/sh #!/bin/sh 复制代码 在 /usr/bin/true 中 回显 $? /usr/bin/false 回显 $?
True 总是成功。如果运行测试脚本,它将返回 0。False
总是失败。如果运行测试脚本,它将返回非 0。(在我的情况下是 1,但可能会有所不同)。