Шаблон 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 

    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 - лучшая ОС в мире.