Go to the first, previous, next, last section, table of contents.


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

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

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

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

syscmd(shell-command)

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

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

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

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

コマンドの出力を読む

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は引数が与えられたときだけ認識されます。

終了コード

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

sysval

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

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

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

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は引数が与えられたときだけ認識されます。


Go to the first, previous, next, last section, table of contents.