#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="$?"
и поделитесь выводом echo4. Перед выполнением сравнения необходимо убедиться, что оба изображения существуют, и убедиться, что ширина и высота одинаковы для простого сравнения. Вы можете получить ширину и высоту с помощью
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