本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > w

wordexp(3C)

HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

wordexp(), wordfree() ― 単語の展開

構文

#include <wordexp.h>

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

void wordfree(wordexp_t *pwordexp);

説明

wordexp() は、単語を展開し、展開した単語のリストを pwordexp が指す構造体に格納します。

引き数 words は、展開する 1 つまたは複数の単語の入った文字列へのポインターです。 展開結果は、シェル sh-posix(1) を参照) のコマンドラインに、何かのユーティリティへの引き数としてこの文字列を与えた場合と同じです。 よって、 words は、引用符で囲わない限り、ニューライン文字やシェルの特殊文字 |, &, ;, < または > を含んでいてはいけません。 ただし、シェルコマンド置換の場合は例外です。 words が、引用符に囲われていないコメント文字 # を含んでいる場合、 wordexp() はこれをコメントを表すトークンの開始文字として扱い、この文字以降を無視します。

構造体型 wordexp_t は、ヘッダーファイル <wordexp.h> で定義してあり、以下の要素を持ちます。

we_wordc  

words がマッチした単語数を格納する size_t 型変数

we_wordv  

展開した単語のリストへのポインターを格納する char** 型変数

we_offs  

pwordexp->we_wordv の先頭に予約領域として空けておくポインター格納場所の数を指示する size_t 型変数

wordexp() は、展開した単語の数を pwordexp->we_wordc に格納します。 フィールド分離やパス名展開で分けられた各々のフィールドが、それぞれ pwordexp->we_wordv リストの 1 単語となります。 単語の順序は、シェルの単語展開の項で説明されているとおりです。 最後の単語を指すポインターの次のポインターは null ポインターです。 パラメータ (たとえば $$ や $* など) の展開については特に指定はありません。

pwordexp が指す記憶領域は、関数を呼び出す側で割り当ててください。 それ以外については、 pwordexp->we_wordv が指すメモリーも含め、 wordexp() が必要に応じて割り当てます。

wordfree() は、直前の wordexp() で割り当てた pwordexp に対応するメモリーをすべて解放します。

引き数 flagswordexp() の動作を制御します。 flags の値は、以下の定数を 0 個またはそれ以上、ビット毎の 論理的 OR をとったものです。 これらの定数は、 <wordexp.h> に定義してあります。

WRDE_APPEND  

展開した単語を、前回 wordexp() を呼び出したときの結果に追加する。

WRDE_DOOFFS  

pwordexp->we_offs を使用します。 このフラグを立てると、 pwordexp->we_wordv の先頭に pwordexp->we_offs 個の null ポインターを格納します。 つまりこの場合、 pwordexp->we_wordv は、 pwordexp->we_offs 個の null ポインターを指し、それに pwordexp->we_wordc 個の単語へのポインターが続き、最後に null ポインターがあることになります。

WRDE_NOCMD  

コマンド置換の要求があった場合に、失敗します。

WRDE_REUSE  

引き数 pwordexp は、前回 wordexp() を呼び出し、正常終了したときに使ったもので、その後 wordfree() を呼び出していないことを表します。 これは、アプリケーションが、まず wordfree() を呼び出し、次に WRDE_REUSE なしで wordexp() を呼び出すことと同じです。

WRDE_SHOWERR  

stderr/dev/null にリダイレクトしません。

WRDE_UNDEF  

未定義のシェル変数を展開しようとした場合に、エラーを報告します。

WRDE_APPEND フラグを使って、以前に wordexp() で展開した単語の後ろに新しい単語の組を追加することができます。 同じ pwordexp を使って、 wordexp() を 2 回またはそれ以上続けて呼び出し、間に wordfree() を呼び出さなかった場合の規則は次のとおりです。

  • 1 回目の呼び出しでは WRDE_APPEND を立ててはいけません。2 回目以降では立てなければなりません。

  • すべての呼び出しで WRDE_DOOFFS を立てるか、どの呼び出しでも立てないかのどちらかに統一する必要があります。

  • 2 回目以降の呼び出しの後、 pwordexp->we_wordv が指すリストの内容は次のとおりです。

    • WRDE_DOOFFS および pwordexp->we_offs で指定した、0 個またはそれ以上の null ポインターがあります。

    • 呼び出す前に pwordexp->we_wordv にあった単語へのポインターが、順序を変えずにあります。

    • 今回の呼び出しで展開された新しい単語へのポインターがあります。

  • pwordexp->we_wordc に格納される値はそれまでの呼び出しで展開した単語の総数です。

  • アプリケーションは wordexp() を呼び出した後にリスト中の項目を変更してもかまいません。しかしその場合、次に同じ pwordexp を使って wordfree() を呼び出したり、 WRDE_APPENDWRDE_REUSE フラグを指定して wordexp() を呼び出したりする前に、変更したものを元の値に戻さなければなりません。

words 中に、ニューライン, |, &, ;, <, >, 小かっこ、 中かっこの各文字が、引用符に囲われない不適切な構文で現れた場合、 wordexp() は失敗し、展開した単語数は 0 となります。

WRDE_SHOWERR flags を立てない場合、 wordexp() は、 words の展開でコマンド置換を行う場合に起動するユーティリティの stderr/dev/null にリダイレクトします。 立てた場合は、 words の展開作業中に構文エラーを見つけると stderr メッセージを出力します。

WRDE_DOOFFS を立てる場合、同じ wordexp を使って呼び出す wordexp()wordfree() について、 pwordexp->we_offs を常に同じ値にします。

戻り値

展開が正常に終了した場合 wordexp() は、0 を戻り値とします。それ以外の場合は <wordexp.h> で定義してある 0 以外の値でエラーを表します。

WRDE_BADCHAR  

words 中に、 |, &, ;, <, >, 小かっこ、 中かっこのどれかの文字が引用符なしで不適切な構文で使われています。

WRDE_BADVAL  

flagsWRDE_UNDEF が立ててある場合に、未定義のシェル変数を参照しました。

WRDE_CMDSUB  

flagsWRDE_NOCMD が立ててある場合に、コマンド置換を行おうとしました。

WRDE_NOSPACE 

メモリーの割当てに失敗しました。

WRDE_SYNTAX  

閉じていない文字列や対応のとれていないかっこがあるなどのシェル構文エラーが発生しました。

WRDE_INTERNAL  

内部エラーが発生しました。

戻り値がエラー WRDE_NOSPACE の場合、 wordexp() は、 pwordexp->we_wordc および pwordexp->we_wordv を、正常に展開した単語について設定します。 それ以外のエラーの場合は、何も変更しません。

著者

wordexp() および wordfree() は、OSF と HP で開発されました。

標準準拠

wordexp(): XPG4, POSIX.2

wordfree(): XPG4, POSIX.2

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.