Bash: Синтаксическая ошибка при @ ()

У меня есть следующая функция в моем файле .bashrc :

 extract() { local cei (($#)) || 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.

Может ли кто-нибудь указать, почему этот код не выглядит портативным? А где ошибка?

One Solution collect form web for “Bash: Синтаксическая ошибка при @ ()”

Как упоминалось в моем комментарии, это распространенная ошибка, которую люди видят при попытке использовать расширенные globs ( shopt -s extglob ) перед включением опции. Сюда входят определения функций.

  • Как я рекурсивно удаляю каталоги с помощью шаблона?
  • Можно ли изменить порядок глобуса?
  • Сортировка файлов по времени модификации
  • Как найти файлы с определенными расширениями, исключая только имена в текущем каталоге?
  • Самый быстрый способ открыть все файлы в каталоге с несколькими расширениями файлов в командной строке
  • Найти файлы, которые не находятся в .gitignore
  • Создайте список файлов из файла, содержащего ряд шаблонов глобусов
  • ImageMagick: преобразование и сохранение нескольких файлов с другим именем
  • Избегание ошибок из-за нерасширенной звездочки
  • Подстановочные знаки командной строки
  • lftp исключает путаницу синтаксиса
  • Linux и Unix - лучшая ОС в мире.