Provided by: manpages-ru-dev_4.21.0-2_all bug

ИМЯ

       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⟩.