Sposób przechwytywania wyjścia błędów z ffmpeg / avconv w skrypcie bash

3

Próbuję wsadowo przekonwertować kilka plików i robię prostą listę przekonwertowanych plików do dokumentu tekstowego, dzięki czemu mogę zatrzymać skrypt i kontynuować od około, kiedy zacząłem.

#! /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;
}

Nie, ekstrakcja napisów również jest w toku, ale mam problem z wiedzą, czy avconv się nie powiedzie, czy istnieje sposób?

Edytować Nieco zrobione teraz z tym skryptem, oto jest http://pastebin.com/trMDRaq5 dzięki za pomoc!

eldamar
źródło

Odpowiedzi:

3

Większość komend zwraca niezerową wartość zwracaną, jeśli wystąpił błąd. Możesz przechwycić ten kod powrotu lub działać na nim za pomocą via || i &&.

Przykłady:

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!

[Edytować]

Możesz również sprawdzić $? w skorupie. przykład:

#!/bin/sh
/usr/bin/true
echo $?
/usr/bin/false
echo $?

Prawda zawsze się udaje. Jeśli uruchomisz skrypt testowy, zwróci on 0.
Fałsz zawsze zawodzi. Jeśli uruchomisz skrypt testowy, zwróci on wartość inną niż 0. (w moim przypadku 1, ale to może się różnić).

Hennes
źródło