реализовать расширение подстановки в оболочке - PullRequest
3 голосов
/ 08 февраля 2011

Я пытаюсь создать пользовательскую оболочку в качестве упражнения и хотел реализовать подстановочное расширение. Как именно оболочки вроде bash выполняют расширение? Я имею в виду, что все шаги участвуют?

Как я понимаю, оболочка ищет имена файлов в текущем каталоге и заменяет аргумент, содержащий '*', именами файлов, которые должны совпадать. Это правильно? Какие другие подстановочные расширения следует использовать оболочке, кроме '*'

Ответы [ 3 ]

5 голосов
/ 08 февраля 2011

Спецификация POSIX описывает расширения слова , которые должны поддерживать POSIX-совместимые оболочки.Для выполнения этих расширений можно использовать функции glob или wordexp POSIX (glob поддерживает только небольшое подмножество расширений, поддерживаемых wordexp).

0 голосов
/ 08 февраля 2011

Технически, подстановочный знак тесно связан с концепцией соответствия . Очень приблизительно, шаги включают в себя:

  • Перевод выражения, содержащего подстановочные знаки, в какую-то выполняемую форму регулярное выражение или конечный автомат .
  • Если мы работаем с FSM, перевод недетерминированного FSM на детерминированный - процесс, называемый определение .
  • Перебор всех возможных кандидатов на сопоставление.
  • Определение соответствия кандидата указанному шаблонному выражению путем запуска какого-либо алгоритма сопоставления с использованием предварительно созданного RE или FSM.
  • Сбор переданных кандидатов вместе в списке, замена подстановочного выражения собранным списком.

Что касается полного набора различных символов, посмотрите документацию для конкретных реализаций оболочки (например, для bash , zsh и т. Д.). Большинство этих вещей отображаются непосредственно в одну или несколько функций механизма, подобного регулярному выражению.

0 голосов
/ 08 февраля 2011

Bourne shell [original sh] поддерживает расширение *, ? и [range].Bash также поддерживает **

...