[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

12. UNIXコマンド実行用の組み込みマクロ

UNIXコマンドをm4内部から呼び出すための組み込みマクロが m4にはいくつか存在します。


12.1 単一のコマンドを実行する

syscmdを使えば任意のシェルコマンドを実行することができます。

 
syscmd(shell-command)

シェルコマンドとしてshell-commandを実行します。

syscmdは展開後、shell-commandからの出力にはならずに 消滅します。shell-commandからの出力やエラーメッセージは m4には読み込まれません。 コマンドの出力を処理する必要があるときはSee section コマンドの出力を読むを参照してください。

コマンドの実行に先立ち、m4は自分の出力バッファをフラッシュします。 shell-commandにおけるデフォルトの標準入力、標準出力、 および標準エラー出力はm4のものと同じです。

syscmdは引数を与えたときだけ認識されます。


12.2 コマンドの出力を読む

UNIXコマンドの出力をm4に読み込ませたいときは esyscmdを使ってください。

 
esyscmd(shell-command)

このマクロはシェルコマンドshell-commandの標準出力の内容に展開されます。

m4はコマンドの実行に先立ち自分の出力バッファをフラッシュします。 shell-commandのデフォルトの標準入力および標準エラー出力は m4のものと同じになります。 shell-commandのエラー出力は展開テキストの一部にはなりません ― m4のエラー出力と一緒に出てくるでしょう。

次の例ではGNU m4ディストリビューションの`checks'ディレクトリ にいると仮定します。

 
define(`vice', `esyscmd(grep Vice ../COPYING)')
⇒
vice
⇒  Ty Coon, President of Vice
⇒

esyscmdの展開によるテキストの後ろに改行がついている様子に 注意してください。

esyscmdは引数を与えたときだけ認識されます。


12.3 終了コード

シェルコマンドの実行が成功したか調べるときは sysvalを使ってください。

 
sysval

このマクロはsyscmdesyscmdで実行した最後のシェルコマンドの 終了ステータス(exit status)に展開されます。

 
syscmd(`false')
⇒
ifelse(sysval, 0, zero, non-zero)
⇒non-zero
syscmd(`true')
⇒
sysval
⇒0

12.4 一時ファイル用の名前を生成

syscmdesyscmdに指定されたコマンドが出力やその他の目的で 一時ファイルを必要とすることもあるでしょう。 一時ファイルの名前を生成するために組み込みマクロmaketempが用意されています。

 
maketemp(template)

このマクロはtemplateを元に作られる、現時点で存在しないファイルの名前に 展開されます。templateは文字列`XXXXXX'で終らなければなりません。 この6つのXはファイル名をユニークにするためにm4のプロセスidを含む 何らかの文字列によって置き換えられます。

 
maketemp(`/tmp/fooXXXXXX')
⇒/tmp/fooa07346
maketemp(`/tmp/fooXXXXXX')
⇒/tmp/fooa07346

例にあるようにmaketempを複数回呼び出すと同じ文字列に展開されることが あります。これは選択の基準がファイルが存在するかどうかだからです。 最初のファイルが作成されていないうちに、maketempを次に呼び出すと、 2つのmaketempマクロの呼び出しは同じ名前に展開される可能性があります。

maketempは引数を与えたときだけ認識されます。


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated by Akihiro Sagawa on June, 15 2005 using texi2html 1.70.