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( ) 时看到的常见错误。这包括函数定义。

相关内容