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()を使用しようとしたときに発生する一般的なエラーです。これには関数定義が含まれます。

関連情報