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
このマクロはsyscmd
やesyscmd
で実行した最後のシェル・コマンドの
終了ステータス(exit status)に展開されます。
syscmd(`false') => ifelse(sysval, 0, zero, non-zero) =>non-zero syscmd(`true') => sysval =>0
syscmd
やesyscmd
に指定されたコマンドが出力やその他の目的で
一時ファイルを必要とすることもあるでしょう。
一時ファイルの名前を生成するために組み込みマクロ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.