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.

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

  • Bash globs как аргументы без файла. Пример: apt-get remove pkg- *
  • Проверьте зависимости bash / shell
  • Sed: изменить каждое повторение не первого слова для каждого слова в тексте
  • Выводить трубку в if?
  • получить выходное и возвращаемое значение grep в одной операции в bash
  • Переменные доступа, установленные внутри подстановок
  • скрипт ~ / .bashrc корректно запускается в ssh, корректно работает с источником ~ / .bashrc
  • Как настроить правильный мониторинг моих услуг автоматическим способом? Так что, если один из них сработает автоматически на лету?
  • One Solution collect form web for “Bash: Синтаксическая ошибка при @ ()”

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

    Linux и Unix - лучшая ОС в мире.