Обработка ошибки Imagemagick в скрипте оболочки Bash - PullRequest
0 голосов
/ 14 марта 2019

Я запускаю сценарий оболочки, который зацикливает более 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 умирает.Так где я здесь не так?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

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

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

#!/bin/bash

compare_result=$(compare -metric AE -fuzz 1% /opt/fotos/239413A.bmp /opt/fotos/54900343.bmp -compose Src imgdiff.bmp 2>&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
0 голосов
/ 14 марта 2019

Я не вижу ваш лог-файл, поэтому предположу, что это $ 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"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...