名 前
wordexp, wordfree − posix シ ェ ル の よ う に 単 語 の 展 開 を 行 う
書 式
#include <wordexp.h>
int wordexp(const char *s, wordexp_t *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 ** で あ り 、 見 つ か っ た 単 語 の 配 列 を 指 し 示 す 。 size_t 型 の フ ィ ー ル ド we_offs は 、 we_wordv 配 列 に あ る 初 期 要 素 の う ち い く つ が NULL で 埋 め ら れ る べ き か を 表 す の に 使 わ れ た り す る (flags に よ り 決 定 さ れ る 。 下 記 を 参 照 。 )。 関 数 wordfree() は 割 り 当 て た メ モ リ ー を 再 度 解 放 す る 。 よ り 正 確 に い う と 、 こ の 関 数 は そ の 引 き 数 を 解 放 す る の で は な く 、 配 列 we_wordv と そ れ が 指 し 示 す 文 字 列 を 解 放 す る 。 文 字 列 引 き 数 こ の 展 開 は シ ェ ル に よ る コ マ ン ド の パ ラ メ ー タ ー の 展 開 (sh(1) を 参 照 ) と 同 じ で あ る の で 、 文 字 列 s は シ ェ ル コ マ ン ド パ ラ メ ー タ ー で 不 正 と さ れ る 文 字 を 含 ん で は な ら な い 。 特 に エ ス ケ ー プ さ れ て い な い 改 行 、 |, &, ;, <, >, (, ), {, } 文 字 を コ マ ン ド 置 換 や パ ラ メ ー タ ー 置 換 の 場 面 以 外 に 含 め て は な ら な い 。 引 き 数 s に ク ォ ー ト し て い な い コ メ ン ト 文 字 # で 始 ま る 単 語 が 含 ま れ て い る 場 合 に は 、 そ の 単 語 と そ れ 以 降 の 単 語 が 無 視 さ れ る か 、 そ れ と も # が コ メ ン ト 文 字 と し て 扱 わ な い か は 、 規 定 さ れ て い な い 。 展 開 実 行 さ れ る 展 開 は 、 以 下 の 段 階 で 構 成 さ れ る : チ ル ダ 展 開 (~user を user の ホ ー ム デ ィ レ ク ト リ に 置 き 換 え る )、 変 数 展 開 ($FOO を 環 境 変 数 FOO の 値 に 置 き 換 え る )、 コ マ ン ド 展 開 ($(command) ま た は `command` を command の 出 力 で 置 き 換 え る )、 算 術 展 開 、 フ ィ ー ル ド 分 割 、 ワ イ ル ド カ ー ド 展 開 、 ク ォ ー ト の 除 去 。 特 殊 な パ ラ メ ー タ ー ($@, $*, $#, $?, $−, $$, $!, $0) の 展 開 結 果 は 規 定 さ れ て い な い 。 フ ィ ー ル ド 分 割 は 環 境 変 数 $IFS を 用 い て 行 わ れ る 。 こ の 環 境 変 数 が 設 定 さ れ て い な い 場 合 、 フ ィ ー ル ド 区 切 り 文 字 は ス ペ ー ス ・ タ ブ ・ 改 行 で あ る 。 出 力 さ れ る 配 列 配 列 we_wordv は 見 つ か っ た 単 語 を を 含 み 、 最 後 に NULL が 続 く 。
flags
引 き 数
flags 引 き 数 は 以
下 の 値 の ビ ッ
ト 包 含 的 OR で あ
る :
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 未 定 義 の シ
ェ ル 変 数 を 展
開 し よ う と し
た 場 合 に 、 エ
ラ ー と し て 扱
う 。
返 り 値
成 功 し た 場 合 は 0 が 返 さ れ る 。 エ ラ ー の 場 合 は 以 下 の 5 つ の 値 の う ち の 1 つ が 返 さ れ る 。
WRDE_BADCHAR 改
行 ま た は |, &, ;, <, >,
(, ), {, } の う ち の 1 つ
が 不 正 に 出 現
し た 。
WRDE_BADVAL 未 定 義 の シ
ェ ル 変 数 が 参
照 さ れ 、 か つ
WRDE_UNDEF フ ラ グ で
こ れ を エ ラ ー
と し て 扱 う よ
う に 指 示 さ れ
て い る 。
WRDE_CMDSUB コ マ ン ド 置
換 が 要 求 さ れ
た が 、 WRDE_NOCMD フ
ラ グ で こ れ を
エ ラ ー と し て
扱 う よ う に 指
示 さ れ て い た
。
WRDE_NOSPACE メ モ リ ー
が 足 り な い 。
WRDE_SYNTAX 対 応 す る 括
弧 が な い 、 ク
ォ ー ト が 合 致
し な い と い っ
た 、 シ ェ ル の
書 式 エ ラ ー 。
バ ー ジ ョ ン
wordexp() と wordfree() は 、 バ ー ジ ョ ン 2.1 以 降 の glibc で 提 供 さ れ て い る 。
準 拠
POSIX.1−2001.
例
以 下 の サ ン プ ル プ ロ グ ラ ム の 出 力 は だ い た い "ls [a−c]*.c" と 同 じ に な る 。
#include
<stdio.h>
#include <stdlib.h>
#include <wordexp.h>
int
main(int argc, char **argv)
{
wordexp_t p;
char **w;
int i;
wordexp("[a−c]*.c",
&p, 0);
w = p.we_wordv;
for (i = 0; i < p.we_wordc; i++)
printf("%s\n", w[i]);
wordfree(&p);
exit(EXIT_SUCCESS); }
関 連 項 目
こ の 文 書 に つ い て
こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。