wordexp, wordfree -
дополняет
слово как
оболочка posix
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);
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 <
[email protected]> и Yuri Kozlov
<
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]