Bash: @()에 구문 오류가 있습니다.

Bash: @()에 구문 오류가 있습니다.

내 파일에는 다음 기능이 있습니다 .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
}

이제 이것은 현재의 Arch Linux 시스템에서 완벽하게 작동합니다. 최근에 나는 새로운 void-linux 배포판을 설치하고 거기에 이전 .bashrc를 사용해 보았습니다.

그러나 Void-Linux에서는 이 함수에서 오류가 발생합니다.

syntax error near unexpected token '('

그리고 다음 줄을 가리킵니다.

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

일부 조사에 따르면 이 배포판의 Bash는 @() 패턴 읽기를 거부하여 오류를 반환하는 것으로 나타났습니다. 몇 달 전에 Debian Stable 시스템에서 동일한 기능을 사용한 것을 기억합니다.

이 코드가 이식 가능하지 않은 이유를 지적할 수 있는 사람이 있습니까? 오류는 어디에 있나요?

답변1

shopt -s extglob내 의견에서 언급했듯이 이는 사람들이 옵션을 활성화하기 전에 확장 glob()을 사용하려고 할 때 나타나는 일반적인 오류입니다. 여기에는 함수 정의가 포함됩니다.

관련 정보