Добавить в цитаты Настройки чтения

Страница 182 из 253

../../03-memory.texi

...

Обратите внимание, что нам пришлось взять аргументы в кавычки, чтобы предотвратить их разворачивание оболочкой!

В былые времена, около V6 Unix, для осуществления разворачивания символов подстановки оболочка использовала за кулисами отдельную программу. Эта программа называлась /etc/glob, и согласно исходному коду V6[130], имя «glob» было сокращением от «global».

Таким образом глагол «to glob» проник в лексикон Unix со значением «осуществлять разворачивание символов подстановки». Это, в свою очередь, дает нам имена функций glob() и globfree(). Так что обычно недооцениваемое чувство юмора, время от времени проглядывающее из руководства Unix, все еще живо, официально сохраненное в стандарте POSIX. (Можете ли вы представить кого-нибудь в IBM в 70-х или 80-х годах XX века, называющего системную процедуру glob()?)

12.7.3. Разворачивание слов оболочкой: wordexp() и wordfree()

Многие члены комитета POSIX чувствовали, что glob() делает недостаточно: им нужна была библиотечная процедура, способная делать все, что может делать оболочка разворачивание тильды ('echo ~arnold'), разворачивание переменных оболочки ('echo $HOME') и подстановку команд ('echo $(cd ; pwd)'). Многие другие чувствовали, что glob() не подходила для этой цели. Чтобы «удовлетворить» каждого, POSIX предоставляет две дополнительные функции, которые делают все:

#include <wordexp.h> /* POSIX */

int wordexp(const char *words, wordexp_t *pwordexp, int flags);

void wordfree(wordexp_t *wordexp);

Эти функции работают сходным с glob() и globfree() образом, но со структурой wordexp_t:

typedef struct {

 size_t we_wordc; /* Число подходящих слов */

 char **we_wordv; /* Список развернутых слов */

 size_t we_offs;  /* Резервируемые в we_wordv слоты */

} wordexp_t;

Члены структуры полностью аналогичны описанным ранее для glob_t; мы не будем здесь повторять все описание.

Как и для glob(), поведение wordexp() управляется несколькими флагами. Флаги перечислены в табл. 12.5.

Таблица 12.5. Флаги для wordexp()