Книга: Linux программирование в примерах
12.7.3. Разворачивание слов оболочкой: wordexp() и wordfree()
12.7.3. Разворачивание слов оболочкой: wordexp()
и wordfree()
Многие члены комитета POSIX чувствовали, что glob()
делает недостаточно: им нужна была библиотечная процедура, способная делать все, что может делать оболочка разворачивание тильды ('echo ~arnold
'), разворачивание переменных оболочки ('echo $HOME
') и подстановку команд ('echo $(cd ; pwd)
'). Многие другие чувствовали, что glob()
не подходила для этой цели. Чтобы «удовлетворить» каждого, POSIX предоставляет две дополнительные функции, которые делают все:
#include <wordexp.h> /* POSIX */
int wordexp(const char *words, wordexp_t *pwordexp, int flags);
void wordfree(wordexp_t *wordexp);
Эти функции работают сходным с glob()
и globfree()
образом, но со структурой wordexp_t
:
typedef struct {
size_t we_wordc; /* Число подходящих слов */
char **we_wordv; /* Список развернутых слов */
size_t we_offs; /* Резервируемые в we_wordv слоты */
} wordexp_t;
Члены структуры полностью аналогичны описанным ранее для glob_t
; мы не будем здесь повторять все описание.
Как и для glob()
, поведение wordexp()
управляется несколькими флагами. Флаги перечислены в табл. 12.5.
Таблица 12.5. Флаги для wordexp()
Константа | Значение |
---|---|
WRDE_APPEND |
Добавить результаты текущего вызова к предыдущим |
WRDE_DOOFFS |
Зарезервировать we_offs мест в начале we_wordv |
WRDE_NOCMD |
Запретить подстановку команд |
WRDE_REUSE |
Повторно использовать память, на которую указывает we_wordv |
WRDE_SHOWERR |
Не молчать при возникновении во время разворачивания ошибок |
WRDE_UNDEF |
Неопределенные переменные оболочки должны вызывать ошибку |
Возвращаемое значение равно 0, если все прошло хорошо, или одно из значений из табл. 12.6, если нет.
Таблица 12.6. Возвращаемые значения ошибок для wordexp()
Константа | Значение |
---|---|
WRDE_BADCHAR |
Метасимвол (конец строки, '|', &, ;, <, >, (, ), {, или }) в недопустимом месте |
WRDE_BADVAL |
Переменная не определена при установленном WRDE_UNDEF |
WRDE_CMDSUB |
Попытка подстановки команды при установленном WRDE_NOCMD |
WRDE_NOSPACE |
Была проблема с выделением динамической памяти |
WRDE_SYNTAX |
Синтаксическая ошибка оболочки. |
Мы оставляем вам в качестве упражнения (см. далее) модификацию ch12-glob.c
для использования wordexp()
и wordfree()
. Вот наша версия в действии:
$ ch12-wordexp 'echo $HOME' /* Развертывание переменных оболочки */
echo
/home/arnold
$ ch12-wordexp 'echo $HOME/*.gz' /* Переменные и символы подстановки */
echo
/home/arnold/48000.wav.gz
/home/arnold/ipmasq-HOWTO.tar.gz
/home/arnold/rc.firewall-examples.tar.gz
$ ch12-wordexp 'echo ~arnold' /* Развертывание тильды */
echo
/home/arnold
$ ch12-wordexp 'echo ~arnold/.p*' /* Тильда и символы подстановки */
echo
/home/arnold/.postitnotes
/home/arnold/.procmailrc
/home/arnold/.profile
$ ch12-wordexp "echo '~arnold/.p*'" /* Кавычки работают */
echo
~arnold/.p*
- Глава 1 Работа с оболочкой
- Ключевые слова
- Улучшенная стратегия вычисления предиката IN и условий, объединенных по OR
- 1.2.1. Ключевые слова и идентификаторы
- Новые ключевые слова
- Определение пользовательского формата числовых данных
- Пример 12-8. Частота встречаемости отдельных слов
- Предисловие
- Предисловие Кое-что новенькое – поговорим напрямую
- 11.2. Технология принятия решения в условиях чрезвычайной ситуации
- Условные операторы
- Прием 45. «Простые слова. Четкие идеи. Сильные эмоции»