Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Linux ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ…Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 182

Автор Роббинс ΠΡ€Π½ΠΎΠ»ΡŒΠ΄

../../03-memory.texi

...

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Π½Π°ΠΌ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²Π·ΡΡ‚ΡŒ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Π² ΠΊΠ°Π²Ρ‹Ρ‡ΠΊΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΎΠΉ!

УнивСрсализация ΠΈΠΌΠ΅Π½? Π§Ρ‚ΠΎ это?

Π’ Π±Ρ‹Π»Ρ‹Π΅ Π²Ρ€Π΅ΠΌΠ΅Π½Π°, ΠΎΠΊΠΎΠ»ΠΎ V6 Unix, для осущСствлСния разворачивания символов подстановки ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° использовала Π·Π° кулисами ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°Π·Ρ‹Π²Π°Π»Π°ΡΡŒ

/etc/glob
, ΠΈ согласно исходному ΠΊΠΎΠ΄Ρƒ V6 [130], имя Β«globΒ» Π±Ρ‹Π»ΠΎ сокращСниСм ΠΎΡ‚ Β«globalΒ».

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π³Π»Π°Π³ΠΎΠ» Β«to globΒ» ΠΏΡ€ΠΎΠ½ΠΈΠΊ Π² лСксикон Unix со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ Β«ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡ‚ΡŒ Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Π½ΠΈΠ΅ символов подстановки». Π­Ρ‚ΠΎ, Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ΠΈΠΌΠ΅Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

glob()
ΠΈ
globfree()
. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅ΠΌΠΎΠ΅ чувство ΡŽΠΌΠΎΡ€Π°, врСмя ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Π»ΡΠ΄Ρ‹Π²Π°ΡŽΡ‰Π΅Π΅ ΠΈΠ· руководства Unix, всС Π΅Ρ‰Π΅ ΠΆΠΈΠ²ΠΎ, ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ сохранСнноС Π² стандартС POSIX. (ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠ³ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² IBM Π² 70-Ρ… ΠΈΠ»ΠΈ 80-Ρ… Π³ΠΎΠ΄Π°Ρ… XX Π²Π΅ΠΊΠ°, Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‰Π΅Π³ΠΎ ΡΠΈΡΡ‚Π΅ΠΌΠ½ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ
glob()
?)

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()
. Π’ΠΎΡ‚ наша вСрсия Π² дСйствии:

$ <b>ch12-wordexp</b> 'echo $HOME' /* Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ */

echo

/home/arnold

$ <b>ch12-wordexp 'echo $HOME/*.gz'</b> /* ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ символы подстановки */

echo

/home/arnold/48000.wav.gz

/home/arnold/ipmasq-HOWTO.tar.gz

/home/arnold/rc.firewall-examples.tar.gz

$ <b>ch12-wordexp 'echo ~arnold'</b> /* Π Π°Π·Π²Π΅Ρ€Ρ‚Ρ‹Π²Π°Π½ΠΈΠ΅ Ρ‚ΠΈΠ»ΡŒΠ΄Ρ‹ */

echo

/home/arnold

$ <b>ch12-wordexp 'echo ~arnold/.p*'</b> /* Вильда ΠΈ символы подстановки */

echo

/home/arnold/.postitnotes

/home/arnold/.procmailrc

/home/arnold/.profile

$ <b>ch12-wordexp &quot;echo '~arnold/.p*'&quot;</b> /* ΠšΠ°Π²Ρ‹Ρ‡ΠΊΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ */