私のファイルには次の機能があります.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()を使用しようとしたときに発生する一般的なエラーです。これには関数定義が含まれます。