EN JA
WORDEXP(3)
WORDEXP(3) FreeBSD Library Functions Manual WORDEXP(3)

名称

wordexpシェルスタイルのワード (単語) 拡張を実行する

ライブラリ

Standard C Library (libc, -lc)

書式

#include < wordexp.h>

int
wordexp( const char * restrict words, wordexp_t * restrict we, int flags);

void
wordfree( wordexp_t *we);

解説

wordexp() 関数は、 words でシェルスタイルのワード (単語) 拡張を実行して、 wewe_wordv メンバの中にワードのリストを、 we_wordc の中にワードの数を置きます。

flags 引数は、次の定数のいずれかのビット単位の論理和 (OR) です:

WRDE_APPEND
wordexp() への前の呼び出しによって生成されたものに単語を追加します。
WRDE_DOOFFS
wewe_offs メンバによって指定されるのと同じくらい多くの NULL ポインタが we_wordv の前に追加されます。
WRDE_NOCMD
words におけるコマンドの置換を禁止します。これを使用する前に、 バグ の注意を参照してください。
WRDE_REUSE
we 引数は、前の成功した wordexp() への呼び出しに渡されますが、 wordfree() に渡されていません。実装は、それに割り付けられた空間を再利用するかもしれません。
WRDE_SHOWERR
/dev/null. にシェルエラーメッセージを出力先変更しません。
WRDE_UNDEF
未定義のシェル変数を展開させる試みに関してエラーを報告します。

wordexp_t 構造体は、次のように < wordexp.h> で定義されます:

typedef struct { 
 size_t we_wordc; /* 一致した単語の数 */ 
 char **we_wordv; /* 単語のリストへのポインタ */ 
 size_t we_offs; /* we_wordv 中の予約するスロット */ 
} wordexp_t;

wordfree() 関数は、 wordexp() によって割り付けられたメモリを解放します。

実装に関する注

wordexp() 関数は、文書化されていない wordexp シェル組み込みコマンドのラッパとして実装されています。

戻り値

wordexp() 関数は、成功すれば 0 を返し、そうでなければ、次のエラーコードの 1 つを返します:
WRDE_BADCHAR
words 引数は、次の引用されていない文字の 1 つを含みます: <改行>, ‘ |’, ‘ &’, ‘ ;’, ‘ <’, ‘ >’, ‘ (’, ‘ )’, ‘ {’, ‘ }’。
WRDE_BADVAL
未定義のシェル変数を展開する試みを行い、 flagsWRDE_UNDEF を設定します。
WRDE_CMDSUB
コマンド置換を使用する試みを行い、 flagsWRDE_NOCMD を設定します。
WRDE_NOSPACE
結果を格納する十分なメモリがありません。
WRDE_SYNTAX
words 中にシェル構文エラーがあります。

wordfree() 関数は、値を返しません。

環境変数

IFS
フィールド分離符 (セパレータ)。

使用例

カレントディレクトリのすべての .c ファイルと /etc/motd (省略されたエラーのチェック) でエディタを呼び出します:

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

診断

シェルからの診断メッセージは、 WRDE_SHOWERRflags に設定されているなら、標準エラー出力に書き込まれます。

規格

wordexp() と wordfree() 関数は、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。

バグ

信頼されていない利用者データを WRDE_NOCMD フラグが設定されるかどうかにかかわらず wordexp() に渡しません。 wordexp() 関数は、それをシェルに渡す前にコマンドを実行する入力を検出することを試みますが、それをだますように同じパーサを使用しません。

現在の wordexp() の実装は、(展開を実行するために呼び出す) シェルがないので、マルチバイト文字を認識しません。

July 29, 2004 FreeBSD