Provided by: manpages-ru-dev_4.21.0-2_all
ИМЯ
wordexp, wordfree - дополняет слово как оболочка posix
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <wordexp.h> int wordexp(const char *restrict s, wordexp_t *restrict p, int flags); void wordfree(wordexp_t *p); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): wordexp(), wordfree(): _XOPEN_SOURCE
ОПИСАНИЕ
Функция wordexp() выполняет раскрытие строки s также, как это делается в оболочке командной строки, и возвращает результат в структуре, на которую указывает p. Тип данных wordexp_t — структура, которая содержит, по крайней мере, поля we_wordc, we_wordv и we_offs. Поле we_wordc имеет тип size_t и содержит количество слов в раскрытой s. Поле we_wordv имеет тип char ** и указывает на массив найденных слов. Поле we_offs имеет тип size_t и (в зависимости от flags, см. далее) используется для указания количества начальных элементов в массиве we_wordv, которые должны быть заполнены NULL. Функция wordfree() освобождает ранее выделенную память. Более точно, она не освобождает память своего аргумента, а освобождает память, занятую под массив we_wordv и строки, которые в нём содержатся. Строковый аргумент Так как дополнение производится согласно правилам оболочки командной строки (см. sh(1)) по преобразованию параметров в команду, строка s не должна содержать символы, которые запрещено передавать в параметрах команд оболочки. В частности, не должно быть неэкранированных символов новой строки или |, &, ;, <, >, (, ), {, } вне контекста подстановки команды или параметра. Если аргумент s содержит слово, которое начинается с символа комментария #, находящегося не в кавычках, то такая ситуация является неопределённой, и непонятно, нужно ли игнорировать слово или все слова, или не считать # символом комментария. Дополнение The expansion done consists of the following stages: tilde expansion (replacing ~user by user's home directory), variable substitution (replacing $FOO by the value of the environment variable FOO), command substitution (replacing $(command) or `command` by the output of command), arithmetic expansion, field splitting, wildcard expansion, quote removal. Результат дополнения специальных параметров ($@, $*, $#, $?, $-, $$, $!, $0) не определён. Field splitting is done using the environment variable $IFS. If it is not set, the field separators are space, tab, and newline. Массив результата Массив we_wordv содержит найденные слова и заканчивается NULL. Аргумент флагов Аргумент flag представляет собой побитовое объединяющее ИЛИ следующих значений: WRDE_APPEND Добавлять найденные слова в массив, полученный в результате предыдущего вызова. WRDE_DOOFFS Вставить we_offs начальных NULL в массив we_wordv (они не считаются в конечном we_wordc). WRDE_NOCMD Не выполнять подстановку команд. WRDE_REUSE Аргумент p получен от предыдущего вызова wordexp(), и функция wordfree() не была вызвана. Повторно использовать выделенное пространство. WRDE_SHOWERR Обычно, во время подстановки команды вывод stderr перенаправляется в /dev/null. Этим флагом задаётся отмена такого перенаправления stderr. WRDE_UNDEF Считать ошибкой, если не определена раскрываемая переменная оболочки.
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
On success, wordexp() returns 0. On failure, wordexp() returns one of the following nonzero values: WRDE_BADCHAR Недопустимое появление символа новой строки или одного из символов |, &, ;, <, >, (, ), {, }. WRDE_BADVAL Указана неопределённая переменная оболочки и установлен флаг WRDE_UNDEF. WRDE_CMDSUB Запрошена подстановка команды, но установлен флаг WRDE_NOCMD, указывающий считать это ошибкой. WRDE_NOSPACE Не хватает памяти. WRDE_SYNTAX Синтаксическая ошибка оболочки, например незакрытая скобка или кавычка.
ВЕРСИИ
wordexp() and wordfree() are provided since glibc 2.1.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7). ┌───────────┬──────────────────────┬──────────────────────────────────────────────────────┐ │Интерфейс │ Атрибут │ Значение │ ├───────────┼──────────────────────┼──────────────────────────────────────────────────────┤ │wordexp() │ Безвредность в нитях │ MT-Unsafe race:utent const:env env sig:ALRM timer │ │ │ │ locale │ ├───────────┼──────────────────────┼──────────────────────────────────────────────────────┤ │wordfree() │ Безвредность в нитях │ MT-Safe │ └───────────┴──────────────────────┴──────────────────────────────────────────────────────┘ В приведённой выше таблице utent в race:utent означает, что если любая из функций setutent(3), getutent(3) или endutent(3) используется одновременно в нескольких нитях программы, то может возникнуть состязательность по данным. Эти функции вызываются из wordexp(), поэтому мы используем race:utent для напоминания.
СТАНДАРТЫ
POSIX.1-2001, POSIX.1-2008.
ПРИМЕРЫ
Результатом следующего примера будет таким же что и при выполнении команды «ls [a-c]*.c». #include <stdio.h> #include <stdlib.h> #include <wordexp.h> int main(void) { wordexp_t p; char **w; wordexp("[a-c]*.c", &p, 0); w = p.we_wordv; for (size_t i = 0; i < p.we_wordc; i++) printf("%s\n", w[i]); wordfree(&p); exit(EXIT_SUCCESS); }
СМ. ТАКЖЕ
fnmatch(3), glob(3)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Azamat Hackimov <azamat.hackimov@gmail.com> и Yuri Kozlov <yuray@komyakino.ru> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.