1

У меня есть сценарий оболочки для преобразования изображений в эффект вышивки. Это сценарий: сценарий вышивки

Этот скрипт является частью веб-приложения. Он нормально работает на моем Mac, однако, после того, как я развернул на своем веб-сервере под управлением CentOS 7, я заметил, что когда я вызываю его (который отображает man-страницу), каждая строка дублируется, см .:

embroidery.sh:

ИСПОЛЬЗОВАНИЕ: вышивка [-n numcolors] [-p рисунок] [-t толщина] [-g грейлимит]
ИСПОЛЬЗОВАНИЕ: вышивка [-n numcolors] [-p рисунок] [-t толщина] [-g грейлимит]
[-f fuzzval] [-b bgcolor] [-a угол] [-r диапазон] [-i интенсивность] [-e экстент]
[-f fuzzval] [-b bgcolor] [-a угол] [-r диапазон] [-i интенсивность] [-e экстент]

Это только первые строки, но это делается для каждой строки справки. Кроме того, скрипт больше не работает, так как когда я загружаю изображение для преобразования его через свое приложение, он генерирует огромные файлы (137 Мб) из исходного файла, даже не 1 Мб.

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

Это может быть связано с ОС? Может сценарий жить где-то еще и быть вызванным двумя версиями одновременно, даже если я запускаю его с путем, подобным так lib/embroidery/embroidery.sh ?

Обновление: Таким образом, эта проблема не была связана с этим поведением, которое было хорошо объяснено Джоном, однако проблема со сценарием, генерирующим огромные файлы, была вызвана старой версией ImageMagick, доступной через репозиторий CentOS, я обновил до 7.0.3, и она работала снова

1 ответ1

3

В вашем скрипте я вижу, что сообщение помощи генерируется с помощью:

usage2()
    {
    echo >&2 ""
    echo >&2 "$PROGNAME:" "$@"
    sed >&2 -e '1,/^####/d;  /^######/g;  /^#/!q;  s/^#*//;  s/^ //;  4,$p' "$PROGDIR/$PROGNAME"
    }

Давайте внимательно посмотрим на команду sed:

sed >&2 -e '1,/^####/d;  /^######/g;  /^#/!q;  s/^#*//;  s/^ //;  4,$p' embroidery

Проблема заключается в том, что (1) по умолчанию sed печатает все, что осталось в пространстве шаблона в конце команд, но (2) команда 4,$p вызывает дополнительную печать. Таким образом, каждая строка печатается дважды.

Одним из решений является использование опции -n для подавления печати по умолчанию:

sed >&2 -ne '1,/^####/d;  /^######/g;  /^#/!q;  s/^#*//;  s/^ //;  4,$p' embroidery

Поскольку OSX (BSD) и CentOS (Linux) используют разные версии sed, возникают некоторые проблемы с совместимостью.


Кстати, эта несколько более простая команда sed работает для меня:

sed >&2 -ne '/^#####/q; 1,/^####/d; s/^#* *//p' embroidery

Мини-пример

Извлекая только некоторые ключевые строки, ваш скрипт выглядит примерно так:

$ cat testfile
#!/bin/bash
#
# misc info 1
# misc info 2
#
####
#
# USAGE: embroidery [-n numcolors ] [-p pattern] [-t thickness] [-g graylimit]
# [-f fuzzval] [-b bgcolor] [-a angle] [-r range] [-i intensity] [-e extent]
# [-N newseed] [-M mix] infile outfile
######
#
usage2()
        {
        sed >&2 -e '1,/^####/d;  /^######/g;  /^#/!q;  s/^#*//;  s/^ //;  4,$p' "$0"
        }

if [ $# -eq 0 ]
then
        # help information
        usage2
        exit 0
fi

Если мы запустим этот скрипт, результат будет выглядеть так:

$ ./testfile 


USAGE: embroidery [-n numcolors ] [-p pattern] [-t thickness] [-g graylimit]
USAGE: embroidery [-n numcolors ] [-p pattern] [-t thickness] [-g graylimit]
[-f fuzzval] [-b bgcolor] [-a angle] [-r range] [-i intensity] [-e extent]
[-f fuzzval] [-b bgcolor] [-a angle] [-r range] [-i intensity] [-e extent]
[-N newseed] [-M mix] infile outfile
[-N newseed] [-M mix] infile outfile

Заменим приведенную выше команду sed на:

    sed >&2 -ne '/^#####/q; 1,/^####/d; s/^#* *//p' "$0"

Теперь вывод выглядит так:

$ ./testfile2

USAGE: embroidery [-n numcolors ] [-p pattern] [-t thickness] [-g graylimit]
[-f fuzzval] [-b bgcolor] [-a angle] [-r range] [-i intensity] [-e extent]
[-N newseed] [-M mix] infile outfile

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .