一种在 Bash 脚本中捕获 ffmpeg/avconv 错误输出的方法

一种在 Bash 脚本中捕获 ffmpeg/avconv 错误输出的方法

我正在尝试批量转换一堆文件,并将转换后的文件简单列出为文本文档,以便我可以停止脚本并从大约开始的地方继续。

#! /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,但可能会有所不同)。

相关内容