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

    Interesting Posts

    Как bash извлекает то, что было написано на терминале (без нажатия Enter)?

    Почему нет стандартной библиотеки для изменения / etc / {passwd, shadow}?

    Почему «init 0» приводит к «избыточным аргументам» при установке Arch?

    odroidxu4 меняет значение по умолчанию uart2 на uart0

    тестовое выражение – сообщение об использовании

    Как выйти из командной строки из командной строки после создания пользователя без полномочий root

    systemD Loaded vs. Enabled

    xterm отображает курсивом вместо обычного

    Разница в сумме вывода pacsysclean vs. expac с использованием awk?

    Какая память не используется процессами и освобождается `echo 3> / proc / sys / vm / drop_caches`?

    Конвертировать весь текст из верхнего регистра в нижний и наоборот?

    Как навсегда избавиться от папки, которая продолжает возвращаться при перезагрузке

    Вопрос об экологической переменной

    find -exec не работает в рыбе

    Слейте ненулевые блоки огромного (разреженного) файла A в огромный файл B

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