I have the following function in my .bashrc
file:
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
}
now this has been working perfectly for me on my current Arch Linux system. Recently, I installed the new, void-linux distro and tried to use my old .bashrc on it.
However, on Void-Linux, this functions throws an error:
syntax error near unexpected token '('
and points to this line:
*.t@(gz|lz|xz|b@(2|z?(2))|a@(z|r?(.@(Z|bz?(2)|gz|lzma|xz)))))
Some investigation returned that the Bash on that distro refuses to read the @() pattern and hence returns an error. I remember using the same function on a Debian Stable system a couple of months ago too.
Can anyone point out why this code doesn't seem to be portable? And where the error is?