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.
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?