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 でシェルスタイルのワード (単語) 拡張を実行して、 we の we_wordv メンバの中にワードのリストを、 we_wordc の中にワードの数を置きます。flags 引数は、次の定数のいずれかのビット単位の論理和 (OR) です:
- WRDE_APPEND
- wordexp() への前の呼び出しによって生成されたものに単語を追加します。
- WRDE_DOOFFS
- we の we_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
- 未定義のシェル変数を展開する試みを行い、 flags に WRDE_UNDEF を設定します。
- WRDE_CMDSUB
- コマンド置換を使用する試みを行い、 flags に WRDE_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_SHOWERR が flags に設定されているなら、標準エラー出力に書き込まれます。規格
wordexp() と wordfree() 関数は、 IEEE Std 1003.1-2001 (“POSIX.1”) に適合しています。バグ
信頼されていない利用者データを WRDE_NOCMD フラグが設定されるかどうかにかかわらず wordexp() に渡しません。 wordexp() 関数は、それをシェルに渡す前にコマンドを実行する入力を検出することを試みますが、それをだますように同じパーサを使用しません。現在の wordexp() の実装は、(展開を実行するために呼び出す) シェルがないので、マルチバイト文字を認識しません。
July 29, 2004 | FreeBSD |