出力リダイレクトの問題 - 自動インクリメントビルドカウンター付きのm4マクロ

出力リダイレクトの問題 - 自動インクリメントビルドカウンター付きのm4マクロ

BUILD私の目標は、ファイル()から値を読み取ってその値を増やし、出力をファイルに保存するm4マクロを作成することです。私は次の解決策を思い出しました(BUILD.m4)。

define(`__buildnumber__',`esyscmd(cat BUILD)')dnl
define(`counter',__buildnumber__)dnl
popdef(__buildnumber__)dnl
define(`count',`define(`counter',eval(counter+1))counter')dnl
count dnl

BUILD3が含まれると出力m4 BUILD.m4が実行されます4。本当に良いです!

ところで、このように呼び出すと、m4 BUILD.m4 > BUILDファイルにはBUILD常に1

別のファイルにパイプするとm4 BUILD.m4 > B機能し、ファイルにはwasがB含まれます。4BUILD3

私はこれが出力リダイレクトに関連していると思います>。これら2つのバリアントをデバッグトレースと比較すると、同じファイルにリダイレクトされるバリアントはもはやそのファイルから読み取れなくなっているようです。

バリアントは別のファイルにリダイレクトされます。

% m4 -dtaeq BUILD.m4 > B
m4trace: -1- define(`__buildnumber__', `esyscmd(`cat BUILD')')
m4trace: -1- dnl
m4trace: -2- __buildnumber__ -> `esyscmd(`cat BUILD')'
m4trace: -2- esyscmd(`cat BUILD') -> `3'
m4trace: -1- define(`counter', `3')

バリアントは同じファイルにリダイレクトされます。

% m4 -dtaeq BUILD.m4 > BUILD
m4trace: -1- define(`__buildnumber__', `esyscmd(`cat BUILD')')
m4trace: -1- dnl
m4trace: -2- __buildnumber__ -> `esyscmd(`cat BUILD')'
m4trace: -2- esyscmd(`cat BUILD')
m4trace: -1- define(`counter', `')

これを行う方法はありますか?または、出力をキャプチャするために別の方法を使用する必要がありますか?

答え1

BUILD> BUILD コマンドで使用するたびに、シェルはm4を実行する前に常に空のファイルを開くため、この機能は機能しません。

BUILDm4スクリプトに書き込むことができます。たとえば、最後の行を次のようcount dnlに置き換えます。

syscmd(`echo 'count` >BUILD')dnl

関連情報