Страница 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()