реализация globbing в прототипе оболочки - PullRequest
4 голосов
/ 25 января 2011

Я реализую оболочку linux для своего уик-энда, и у меня возникли некоторые проблемы с реализацией сопоставления wilcard как функции в оболочке.Как все мы знаем, оболочки сами по себе являются полным языком, например, bash, ksh и т. Д. Мне не нужно реализовывать полные функции, такие как структуры управления, задания и т. Д. Но как реализовать *?

Быстрый анализ дает следующий результат:

echo *

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

Также я слышал о Perl-совместимых регулярных выражениях, но, похоже, сложно использовать стороннюю библиотеку.

Какие-либо предложения, ссылки и т. Д.?Я постараюсь посмотреть исходный код, а также bash.

Ответы [ 3 ]

3 голосов
/ 25 января 2011

Это называется "globbing", а функция, выполняющая это, называется так же: glob (3)

2 голосов
/ 25 января 2011

Да, это то, что делает оболочка. Он заменит символы '*' всеми именами файлов и папок в cwd. На самом деле это очень простые регулярные выражения, поддерживающие только '?' и '*' и соответствующие именам файлов и папок в cwd. Обратите внимание, что обратная косая черта \* и '*', заключенная в простые или двойные кавычки ' или ", не заменяется (обратная косая черта и кавычки удаляются перед передачей выполненной команде).

1 голос
/ 26 января 2011

Если вам нужно больше контроля, чем дает glob, стандартная функция fnmatch выполняет только сопоставление глобусов.

Обратите внимание, что оболочки также выполняют расширение слов(например, "~""/home/user"), что следует сделать перед расширением глоба, если вы выполняете сопоставление имен файлов вручную.(Или используйте wordexp.)

...