Обнаруживать программные ошибки в скриптах bash? - PullRequest
3 голосов
/ 06 декабря 2009

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

Ниже почти то, что я делаю ...

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

Ответы [ 5 ]

6 голосов
/ 06 декабря 2009

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

first-cmd && second-cmd

В этом случае second-cmd будет выполняться, только если first-cmd возвращает true.

Аналогично, вы можете проверить на отказ и предпринять соответствующие действия, используя ||

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

Затем вы можете обработать текст ошибки, чтобы получить дополнительную информацию для условного действия в вашем коде.

См .: Захватить вывод в переменную и Как перенаправить stderr в канал?

5 голосов
/ 06 декабря 2009

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

ffmpeg <your args>
RC=$?
if [ "${RC}" -ne "0" ]; then
    # Do something to handle the error.
else
    # Everything was ok.
fi
1 голос
/ 07 декабря 2009

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

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

1 голос
/ 06 декабря 2009

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

lskdf      # Unrecognized command.
echo $?    # Non-zero exit status returned because command failed to execute.
0 голосов
/ 06 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...