Обработка ошибки Imagemagick в сценарии оболочки Bash

#bash #shell #imagemagick

#bash #оболочка #imagemagick

Вопрос:

Я запускаю скрипт оболочки, который перебирает более 12 000 изображений, сравнивая каждое со своим двойным изображением в другом каталоге. Проблема в том, что когда двойное изображение не существует, Imagemagick просто умирает и сообщает об ошибке, но я не могу получить дескриптор для внесения записи в журнал об ошибке.

Код, который я пытаюсь:

 #!/bin/bash

compare -metric AE -fuzz 1% /opt/fotos/239413.bmp /opt/fotos/549005.bmp -compose Src imgdiff.bmp
result="$?"

if [ "$result" -ne 0 ]; then
    echo "Your command exited with non-zero status $result"
fi

exit 0
  

Вот в чем проблема, потому что ImageMagick возвращает

 compare-im6.q16: image widths or heights differ `/opt/fotos/239413.bmp' @ error/compare.c/CompareImageCommand/1000.
  

Теперь я ожидаю, что $ result будет содержать эту строку, но bash ожидает 0-255. Просто чтобы вы знали, что сама команда работает идеально, когда есть изображения для сравнения, возвращая количество пикселей, которые отличаются, поэтому команда работает так, как требуется.

Это просто когда возникает ошибка и Imagemagick умирает. Итак, где я здесь ошибаюсь?

Комментарии:

1. Я не понимаю проблему. У вас уже есть дескриптор на случай сбоя команды. Вы можете добавить echo для записи в свой журнал об ошибке. В чем проблема? Каков ожидаемый результат?

2. Я не понимаю вашей проблемы. Если я протестирую его, он будет работать хорошо, повторите сообщение с вашей командой… Итак, в чем проблема?

3. поставьте echo $result после result="$?" и поделитесь выводом echo

4. Перед выполнением сравнения необходимо убедиться, что оба изображения существуют, и убедиться, что ширина и высота одинаковы для простого сравнения. Вы можете получить ширину и высоту с помощью convert image -format "%w" info: и convert image -format "%h" info: . Поместите эти значения в переменные. Затем выполните тест if, чтобы проверить, что они оба существуют и что ширина одинакова, а высота одинакова. Если вы уверены, что два соответствующих изображения имеют одинаковую ширину и высоту, тогда пропустите эту часть теста и просто проверьте наличие обоих. Проверьте, существует ли [ -f image_file].

5. Ваше условие неверно. Попробуйте, если [ «$result» != «0»]; Вы сравнивали строку с целым числом. Вы хотите сравнить строку со строкой. Поэтому заключите ваш 0 в кавычки и измените -ne на !=.

Ответ №1:

Я не вижу ваш файл журнала, поэтому я предполагаю, что это $ logfile. Сохраните сообщение об ошибке, записав stderr:

 tmpfile=$(mktemp /tmp/myscript.err.XXXXXX)
compare -metric AE -fuzz 1% /opt/fotos/239413.bmp /opt/fotos/549005.bmp -compose Src imgdiff.bmp 2>"$tmpfile"

result="$?"

if [ "$result" -ne 0 ]; then
    echo "Your command exited with non-zero status $result"
    cat "$tmpfile" >> $logfile
fi
rm "$logfile"

exit 0
  

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

 result=`cat "$logfile"`
  

Ответ №2:

Надеюсь, следующий код, который я буду использовать в качестве основы для своего решения, объяснит, что я пытался сделать. Я протестировал это, и оно делает то, что я хочу, но я должен упомянуть, что я рассматриваю возможность реализации того, что предложил пользователь fmw42, но пока выберу этот маршрут.

Да, я знаю, что сообщения могли измениться, но буду разбираться с ними по мере необходимости. Надеюсь, это кому-нибудь поможет.

 #!/bin/bash

compare_result=$(compare -metric AE -fuzz 1% /opt/fotos/239413A.bmp /opt/fotos/54900343.bmp -compose Src imgdiff.bmp 2>amp;1)

if echo "$compare_result" | grep -q "No such file or directory @"; then
    echo "No such file or directory was returned handle accordingly."
    exit 1
fi

if ! [[ "$compare_result" =~ ^[0-9] $ ]]; then
    echo "Compare returned an invalid integer: $compare_result"
    exit 1
fi

echo "The final result was: $compare_result"

exit 0