Scroll to navigation

wordexp(3) Library Functions Manual wordexp(3)

ИМЯ

wordexp, wordfree - дополняет слово как оболочка posix

БИБЛИОТЕКА

Стандартная библиотека языка C (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 представляет собой побитовое объединяющее ИЛИ следующих значений:

Добавлять найденные слова в массив, полученный в результате предыдущего вызова.
Вставить we_offs начальных NULL в массив we_wordv (они не считаются в конечном we_wordc).
Не выполнять подстановку команд.
Аргумент p получен от предыдущего вызова wordexp(), и функция wordfree() не была вызвана. Повторно использовать выделенное пространство.
Обычно, во время подстановки команды вывод stderr перенаправляется в /dev/null. Этим флагом задаётся отмена такого перенаправления stderr.
Считать ошибкой, если не определена раскрываемая переменная оболочки.

ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ

On success, wordexp() returns 0. On failure, wordexp() returns one of the following nonzero values:

Недопустимое появление символа новой строки или одного из символов |, &, ;, <, >, (, ), {, }.
Указана неопределённая переменная оболочки и установлен флаг WRDE_UNDEF.
Запрошена подстановка команды, но установлен флаг WRDE_NOCMD, указывающий считать это ошибкой.
Не хватает памяти.
Синтаксическая ошибка оболочки, например незакрытая скобка или кавычка.

ВЕРСИИ

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 (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.

5 февраля 2023 г. Справочные страницы Linux 6.03