Проверка кодов ошибок из программ - в частности, HTK Toolkit - PullRequest
1 голос
/ 20 апреля 2011

У меня есть скрипт bash, который вызывает HTK компоненты, такие как HCopy и HVite, чтобы вычислить границы уровня телефона для фрагмента текста.Как я могу проверить, была ли операция успешной?Я пробовал следующее:

  1. ./findWordBoundary.sh <input args> |& tee run.log

Приведенный выше подход не работает.Все, что выводится утилитами HTK, записывается в run.log, за исключением оператора Error и условия.Поэтому использование grep на run.log не является началом.

  1. x=./findWordBoundary.sh <input args> также не работает.Он просто сбрасывает целую загрузку сообщений, кроме условий ошибки, на x.

Я ищу вот что:
Способ входа в систему и принятия соответствующих действий, когдаHTK операции приводят к ошибкам.Кроме того, я думаю, что это может быть расширено до более общих утилит bash, например, wget.Как один журнал и ошибка из утилиты bash обрабатывают ее из скрипта (например, когда wget возвращает 404:Not found exception)?

Спасибо,
Шрирам.

1 Ответ

1 голос
/ 20 апреля 2011

Как правило, команды Unix / Linux завершают работу и выдают код выхода.Стандартное значение для успеха равно 0 и ненулевое значение для ошибок.

Вы можете видеть, что ваши HT-инструменты выдают правильно сформированные коды выхода, как этот

HTcopy ... (args ) ...
echo $?

, если вы настроили HTcopyтаким образом, вы знаете, что должны получить ошибку И echo $? возвращает ненулевое значение, а затем проверьте, что хороший набор аргументов команды выдает 0.

Если вы получаете правильные коды выхода, вы можете написать свой код как

if HTcopy .. (args).. ; then
   printf "do the next step\n"
   #etc
else
   printf "error on HTcopy, can't continue\n"
   exit 1
fi

Другой способ заключается в захвате кода выхода в переменную

HTcopy ... (args ) ...
h_rc=$?
if [[ ${h_rc} != 0 ]]] ; then
   printf "error on HTcopy, can't continue\n"
   exit 1
fi

Кроме того, стандарт Unix / Linux использует два отдельных потока для сообщений.STDOUT - это место, куда отправляются обычные сообщения и сообщения об успехе, а STDERR - это то, куда отправляются сообщения об ошибках.Вы можете перехватить сообщения STDERR, перенаправив их в поток STDOUT.Используя приведенный выше пример, где «grep - это не стартер», вы можете сделать

./findWordBoundary.sh <input args> 2>&1 |& tee run.log

Надеюсь, это поможет.

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