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
BUILD
3が含まれると出力m4 BUILD.m4
が実行されます4
。本当に良いです!
ところで、このように呼び出すと、m4 BUILD.m4 > BUILD
ファイルにはBUILD
常に1
。
別のファイルにパイプするとm4 BUILD.m4 > B
機能し、ファイルにはwasがB
含まれます。4
BUILD
3
私はこれが出力リダイレクトに関連していると思います>
。これら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を実行する前に常に空のファイルを開くため、この機能は機能しません。
BUILD
m4スクリプトに書き込むことができます。たとえば、最後の行を次のようcount dnl
に置き換えます。
syscmd(`echo 'count` >BUILD')dnl