wordexp()

Выполнить раскрытие строки в стиле командной оболочки shell

Прототип:

#include <wordexp.h>
int wordexp( const char *words,
wordexp_t *pwordexp,
int flags );

Аргументы:

words
Строка символов, подлежащая раскрытию.
pwordexp
Список раскрытых слов, возвращаемых функцией. Список характеризуется типом wordexp_t.
flags
Комбинация следующих констант:
WRDE_APPEND
Добавить результаты работы функции к предыдущему вызову wordexp().
WRDE_DOOFFS
Добавить в начало wordexp_t::we_wordv такое число символов NULL, сколько указано в wordexp_t::we_offs.
WRDE_NOCMD
Запретить подстановку команд в words.
WRDE_REUSE
Аргумент pwordexp был ранее передан предыдущему успешному вызову wordexp(), но не был освобожден с помощью wordfree(). Функция может повторно использовать выделенное пространство.
WRDE_SHOWERR
Не перенаправлять сообщения об ошибках оболочки в /dev/null.
WRDE_UNDEF
Сообщать об ошибке, если обнаружены неопределенные переменные окружения.

Библиотека:

libc

Описание:

Фукнция позволяет произвести обработку строки с раскрытием специфических для командной оболочки конструкций, таких, например, как переменные окружения, знак "~" и подстановка команд.

При использовании параметра pwordexp следует помнить, что пользователь должен выделить память для переменной типа wordexp_t самостоятельно. Функция wordexp() выделит требуемый объем памяти для полей структуры по мере необходимости. Для освобождения этой памяти должна использоваться функция wordfree().


Caution: Не передавайте ненадежные пользовательские данные в wordexp(), независимо от установки флага WRDE_NOCMD. Функция пытается обнаружить ввод, что может привести к выполнению команд перед передачей их в оболочку, но она не использует тот же парсер, поэтому её можно обмануть.

Сообщения об ошибках выводятся в стандартный файл ошибок только если установлен флаг WRDE_SHOWERR.

Возвращаемое значение:

0
Успешное завершение.
WRDE_BADCHAR
Аргумент words содержит один из следующих символов в недопустимой позиции: новая строка, "|", "&", ";", "<", ">", "(", ")", "{", "}".
WRDE_BADVAL
Переменная не определена при установленном флаге WRDE_UNDEF.
WRDE_CMDSUB
Попытка подстановки команды при установленном флаге WRDE_NOCMD.
WRDE_NOSPACE
Не хватает памяти для хранения результата.
WRDE_SYNTAX
Синтаксическая ошибка оболочки.
WRDE_ERRNO
Произошла ошибка, установлен errno.

Примеры:

wordexp_t we;
wordexp( "${EDITOR:-vi} *.c /etc/motd", &we, 0 );
execvp( we->we_wordv[0], we->we_wordv );

Переменные окружения:

IFS
Разделители полей. Если переменная не установлена, используются "\t\n".

Классификация:

POSIX 1003.1 (IEEE Std 1003.1-2001)

Поддерживается, начиная с ЗОСРВ «Нейтрино» редакции 2020

Безопасность использования
Точка остановки потока
Нет
Обработчик прерываний
Нет
Обработчик сигналов
Нет
В потоке
Да

Тематические ссылки:

wordexp_t, glob(), globfree(), wordfree()




Предыдущий раздел: Описание API системной библиотеки