Bash: erro de sintaxe em @ ()

2

Eu tenho a seguinte função no meu arquivo .bashrc :

extract() {
    local c e i

    (($#)) || return

    for i; do
        c=''
        e=1

        if [[ ! -r $i ]]; then
            echo "$0: file is unreadable: \'$i'" >&2
            continue
        fi

        case $i in
        *.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))
               c='bsdtar xvf';;
        *.7z)  c='7z x';;
        *.Z)   c='uncompress';;
        *.bz2) c='bunzip2';;
        *.exe) c='cabextract';;
        *.gz)  c='gunzip';;
        *.rar) c='unrar x';;
        *.xz)  c='unxz';;
        *.zip) c='unzip';;
        *)     echo "$0: unrecognized file extension: \'$i'" >&2
               continue;;
        esac

        command $c "$i"
        e=$?
    done

    return $e
}

agora isso tem funcionado perfeitamente para mim no meu sistema Arch Linux atual. Recentemente, instalei a nova distro void-linux e tentei usar minha antiga .bashrc nela.

No entanto, no Void-Linux, esta função gera um erro:

syntax error near unexpected token '('

e aponta para esta linha:

*.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))

Algumas investigações retornaram que o Bash nessa distro se recusa a ler o padrão @ () e, portanto, retorna um erro. Lembro-me de usar a mesma função em um sistema Debian estável alguns meses atrás também.

Alguém pode apontar porque esse código não parece ser portátil? E onde está o erro?

    
por darnir 16.09.2014 / 19:22

1 resposta

6

Como mencionado no meu comentário, esse é um erro comum que as pessoas veem quando tentam usar globs estendidos ( shopt -s extglob ) antes de ativar a opção. Isso inclui definições de funções.

    
por 16.09.2014 / 19:47