Справка по сценарию оболочки, как пропустить файл отчета об ошибках?

Мой текущий сценарий оболочки выглядит следующим образом:

for i in *.pdf
do
    convert -density 400 $i -depth 8 ${i/pdf/jpg}
done

for j in *.jpg
do
    tesseract -l eng $j ${j/.jpg}
    rm $j
    mv ${j}.txt textfile
done

Итак, что он примерно делает, так это то, что для каждого файла PDF он преобразует его в файл jpg, и для каждого файла jpg я использую tesseract для преобразования его в необработанный текстовый файл. При преобразовании pdf в jpg ошибка не возникает, но tesseract может сообщать об ошибках, таких как: «Отменено повторение длины 0 из-за соединения». И мой скрипт останавливается оттуда... Есть ли способ сделать мой скрипт таким, чтобы он пропускал, как только увидит какое-то сообщение об ошибке?? Поэтому мне не нужно расшифровывать поврежденные файлы jpg и я хочу их пропустить. Любая помощь будет оценена по достоинству!


person Sardonic    schedule 25.04.2013    source источник


Ответы (3)


Вы можете проверить $? (код возврата из предыдущей команды) и выйти из сценария, когда он не равен нулю (например, не удалось).

[ $? != 0 ] && echo "Failed and died"
# More traditionally
if [ $? != 0 ] ; then
  return_val=$?
  echo "Failed with ${return_val} code"
  exit $return_val
fi

Вы также можете объединить свои потоки вывода (stdout, stderr) в stdout и взять значение

r=$(tessaract -l eng $j ... &>/dev/stdout)

И $r будет содержать результат stderror.

Кроме того, вы можете отправить вывод в другой созданный вами файловый дескриптор через exec.

person mango parade    schedule 25.04.2013
comment
правильным оператором сравнения для сравнения не строк в этом случае будет -ne вместо !=. Также в случае # More traditionally код выхода должен быть сохранен перед if [ $? -ne 0 ], потому что значение $? будет установлено кодом выхода [ $? -ne 0], поэтому всегда будет 0. - person Alex; 25.04.2013

tesseract возвращает ошибку в командную строку.

for j in *.jpg
do
    tesseract -l eng $j ${j/.jpg}
    [ $? -ne 0 ]  && break
    rm $j
    mv ${j}.txt textfile
done
person jim mcnamara    schedule 25.04.2013
comment
Не могли бы вы сказать мне, что [$? -ne 0] строка делает?? Я попробовал это, и это, кажется, не работает. Я хочу, чтобы он пропустил этот файл jpg и перешел к следующему, но мой скрипт все еще зависает из-за ошибки. - person Sardonic; 25.04.2013
comment
[пробел $? -ne 0 пробел ] работает. С обеих сторон [ и ] должен быть пробел. Что он делает: проверяет выход (возвращаемое значение из тессеракта. ноль ( 0 ) означает, что я закончил нормально. Любое другое значение означает, что я не прошел. - person jim mcnamara; 25.04.2013

Если ваш скрипт прерывается, когда tesseract терпит неудачу, то у вас, вероятно, есть set -e в верхней части скрипта. Если вы хотите, чтобы сценарий прервался при сбое tesseract, добавьте set -e или убедитесь, что tesseract завершается успешно:

if ! tesseract -l eng $j ${j/.jpg}; then exit 1; fi

or

 tesseract -l eng $j ${j/.jpg} || exit 1
person William Pursell    schedule 25.04.2013