Шаблон KSH из переменной не работает

Может ли кто-нибудь объяснить мне, почему шаблон в оболочке Korn (назначается переменной) работает следующим образом:

u@h:w$ pattern='file_[0-9][0-9]' u@h:w$ ls $pattern file_01 file_02 file_03 

Но это не работает для более умного шаблона file_{2}([0-9]) :

 $ pattern='file_{2}([0-9])' $ ls $pattern ls: file_{2}([0-9]): No such file or directory 

  • проанализировать файл журнала, который принимает аргумент (время выполнения тестов)
  • Рекурсивно удалять подкаталоги, не содержащие шаблона в OSX
  • Как удалить текст, сопоставляющий определенные шаблоны из файла
  • Почему эта операция переименования не работает?
  • Как сортировать файлы в подпапку на основе части имени файла?
  • One Solution collect form web for “Шаблон KSH из переменной не работает”

    Это преднамеренно, чтобы не нарушать соответствие POSIX (хотя первоначально это было, чтобы не нарушать совместимость Bourne).

     echo file_{2}([0-9]) 

    будет неправильным кодом в Bourne / POSIX sh , поэтому ksh может свободно интерпретировать его так, как он хочет. Но:

     pattern='file_{2}([0-9])' echo $pattern 

    является действительным кодом Bourne / POSIX sh и, согласно POSIX, предназначен для сопоставления с файлами с именем file_{2}(0) , file_{2}(1)

    Расширенные операторы недоступны, если они являются результатом расширения, даже если вы используете:

     echo @($pattern) 

    Вам нужно будет использовать eval , или вы также можете использовать FIGNORE :

     FIGNORE="!($pattern)"; echo * 

    (будьте осторожны, это влияет на расширение скрытых файлов, сделайте это FIGNORE="@(.*|!($pattern))" если вы не ожидаете, что glob расширит скрытые файлы).

    Обратите внимание, что bash и zsh позже приняли некоторые из этих расширенных операторов ksh (хотя и не {x,y}(...) ), но они по-разному совместили совместимость POSIX / Bourne: они делают эти расширенные глобы доступными во всех контекстах, но только когда включена определенная опция ( kshglob в zsh , extglob в bash ). Это означает, однако, что это затрудняет им добавлять больше операторов, не нарушая их собственной обратной совместимости. Например, если bash добавил {x,y}(...) теперь, он мог бы сломать скрипты, ожидающие a='{1}(2){3}'; [[ $a = $a ]] a='{1}(2){3}'; [[ $a = $a ]] чтобы вернуть true.

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