Script de shell: cada linha é chamada duas vezes?

1

Eu tenho um script de shell para converter imagens em um efeito de bordado. Este é o script: Script de bordado

Este script faz parte de um aplicativo da web. Ele roda normalmente no meu Mac, no entanto, depois que eu implantei no meu servidor web rodando o CentOS 7, notei que quando eu ligo (que exibe a página man) toda linha é duplicada, veja:

embroidery.sh:

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]

Estas são apenas as primeiras linhas, mas isso é feito para cada linha da ajuda. Além disso, o script não funciona mais como quando eu faço upload de uma imagem para convertê-lo através do meu aplicativo, o script gera arquivos enormes (137 Mb) a partir de um arquivo original de até 1 Mb.

Estou realmente confuso sobre o que está acontecendo aqui. Tem a menor idéia do que poderia estar causando isso?

Pode ser relacionado ao sistema operacional? O script pode estar em outro lugar e ser chamado de duas versões ao mesmo tempo, mesmo que eu esteja rodando com o caminho como lib/embroidery/embroidery.sh ?

Atualização: Portanto, esse problema não estava relacionado a esse comportamento, o que foi bem explicado por John, mas o problema com o script gerando arquivos enormes foi causado pela versão antiga do ImageMagick disponível através do repositório CentOS , Atualizei para o 7.0.3 e funcionou novamente

    
por Geoffrey Hug 13.10.2016 / 23:52

1 resposta

3

No seu script, observo que a mensagem de ajuda é gerada por meio de:

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

Vamos analisar atentamente o comando sed:

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

O problema é que (1) por padrão, sed imprime o que resta no espaço padrão no final dos comandos, mas (2) o comando 4,$p causa um adicional impressão. Assim, cada linha é impressa duas vezes.

Uma solução é usar a opção -n para suprimir a impressão padrão:

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

Como o OSX (BSD) e o CentOS (Linux) usam versões diferentes do sed, alguns problemas de compatibilidade ocorrem.

A propósito, esse comando sed mais simples funciona para mim:

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

Mini-exemplo

Extraindo apenas algumas linhas-chave, o seu script é parecido com:

$ 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

Se executarmos este script, a saída será semelhante a:

$ ./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

Vamos substituir o comando sed acima por:

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

Agora, a saída parece:

$ ./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
    
por 14.10.2016 / 00:18