Linux программирование в примерах
Шрифт:
Строки 33–45 являются основой программы. Они перебирают в цикле шаблоны, приведенные в командной строке, вызывая для каждого
Строки 39–41 не являются хорошими; нужно было использовать отдельную функцию, преобразующую целые константы в строки; мы сделали это главным образом ради экономии места. Код наподобие этого может быть сносным для небольших программ, но более крупные должны использовать функцию.
Если вы подумаете о работе, происходящей под капотом (открытие и чтение каталогов, сопоставление шаблонов, динамическое выделение памяти для увеличения списка, сортировка списка), можете качать ценить, как много для вас делает
Обратите внимание, что нам пришлось взять аргументы в кавычки, чтобы предотвратить их разворачивание оболочкой!
В былые времена, около V6 Unix, для осуществления разворачивания символов подстановки оболочка использовала за кулисами отдельную программу. Эта программа называлась
Таким образом глагол «to glob» проник в лексикон Unix со значением «осуществлять разворачивание символов подстановки». Это, в свою очередь, дает нам имена функций
130
См
12.7.3. Разворачивание слов оболочкой:
Многие члены комитета POSIX чувствовали, что
Эти функции работают сходным с
Члены структуры полностью аналогичны описанным ранее для
Как и для
Таблица 12.5. Флаги для
Константа | Значение |
---|---|
WRDE_APPEND | Добавить результаты текущего вызова к предыдущим |
WRDE_DOOFFS | Зарезервировать we_offs
we_wordv |
WRDE_NOCMD | Запретить подстановку команд |
WRDE_REUSE | Повторно использовать память, на которую указывает we_wordv |
WRDE_SHOWERR | Не молчать при возникновении во время разворачивания ошибок |
WRDE_UNDEF | Неопределенные переменные оболочки должны вызывать ошибку |
Возвращаемое значение равно 0, если все прошло хорошо, или одно из значений из табл. 12.6, если нет.
Таблица 12.6. Возвращаемые значения ошибок для
Константа | Значение |
---|---|
WRDE_BADCHAR | Метасимвол (конец строки, '|', &, ;, <, >, (, ), {, или }) в недопустимом месте |
WRDE_BADVAL | Переменная не определена при установленном WRDE_UNDEF |
WRDE_CMDSUB | Попытка подстановки команды при установленном WRDE_NOCMD |
WRDE_NOSPACE | Была проблема с выделением динамической памяти |
WRDE_SYNTAX | Синтаксическая ошибка оболочки. |
Мы оставляем вам в качестве упражнения (см. далее) модификацию
12.8. Регулярные выражения
Регулярные выражения являются способом описания текстовых шаблонов для сопоставления. Если вы вообще сколько-нибудь использовали GNU/Linux или Unix, вы без сомнения знакомы с регулярными выражениями: они являются фундаментальной частью инструментария программиста Unix. Они неотъемлемы от таких повседневных программ, как