2009-12-06 1 views
3

Я пытаюсь написать свой первый полупрофессиональный сценарий bash, который примет ввод в виде имени файла, относящегося к видео avi, и отправьте его на номер ffmpeg, чтобы преобразовать его в mp4 (сохраняя исходное имя), а затем передайте его до MP4Box.Обнаружение ошибок программы в сценариях bash?

Ниже довольно много, что я делаю ...

#!/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 
  • Есть ли какая-то Try/уловом я могу сделать для первого вызова программы, чтобы убедиться, что MP4Box получает работоспособный вход?
  • Должен ли я вообще вообще беспокоиться об ошибке, должен ли я вместо этого полагаться на сами программы, чтобы сделать это для меня?

ответ

6

Один быстрый способ, чтобы сделать выполнение одной программы зависит от успеха другого заключается в использовании &&. (Ниже команды все псевдокод)

first-cmd && second-cmd 

В этом случае второй-CMD будет выполняться только тогда, когда первый-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

Да, вы должны беспокоиться об ошибках, и это действительно не является большой проблемой для этого - все, что вам нужно сделать, это проверить код выхода исполняемого вами приложения - как правило, если все пойдет хорошо, приложение должен возвращать код выхода, равный нулю - посмотрите здесь, если вам нужно больше деталей тоже: http://tldp.org/LDP/abs/html/exit-status.html

lskdf  # Unrecognized command. 
echo $? # Non-zero exit status returned because command failed to execute. 
0

Если FFmpeg является хорошим гражданином, он возвращает код завершения 0 в случае успеха и некоторые другие значение при сбое.

"$?" представляет собой специальную конструкцию bash, которая сообщает код возврата последнего выполненного процесса. После строки ffmpeg вы можете проверить «$?» против ненулевых значений и выхода по ошибке.

5

В целом вы можете проверить код возврата, чтобы определить результат команды. Вы можете получить код возврата ранее выполненной команды, используя специальную переменную $?. Помните, что это обновление после каждой команды, поэтому используйте его для установки другой переменной. Например, RC = $?. Коды возврата обычно равны 0 для успеха и не равны нулю для сбоев. Конкретные ненулевые коды возврата могут указывать на конкретные типы сбоев. Проверьте справочную страницу своей команды, чтобы узнать, как их интерпретировать. Когда у вас есть код возврата, вы можете использовать его для разветвления. Например:

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

Вы можете запустить оболочку с -e, или поставить команду set -e в сценарии. Это приведет к завершению работы скрипта, если какая-либо из команд возвращает ненулевой статус выхода.

Если вам нужно запустить команду, в которой вы не хотите, чтобы ненужный выход заставлял скрипт завершаться, добавьте команду || true.