我的文件中有以下函数.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( ) 时看到的常见错误。这包括函数定义。