내 파일에는 다음 기능이 있습니다 .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()을 사용하려고 할 때 나타나는 일반적인 오류입니다. 여기에는 함수 정의가 포함됩니다.