Terminal

輸出重定向問題 - 具有自增建構計數器的 m4 宏

  • October 7, 2022

我的目標是創建一個 m4 宏,它從文件 ( ) 中讀取一個值BUILD,增加它,然後將輸出保存到文件中。我想出了以下解決方案(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 > BUILDBUILD文件總是包含1.

如果我通過管道傳輸到另一個文件m4 BUILD.m4 > B,它可以工作,並且該B文件將包含4when BUILDwas 3

我懷疑它與>輸出重定向有關。將這兩種變體與調試跟踪進行比較時,似乎重定向到同一文件的變體無法再從文件中讀取。

變體重定向到不同的文件:

% 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', `')

有沒有這樣的方法,或者我需要使用其他一些方法來擷取輸出

BUILD每當您在命令中使用時,shell 總是首先清空文件> BUILD ,然後再執行 m4,因此這永遠不會起作用。

您可以嘗試將 write 放入BUILDm4 腳本中。例如,將最後一行替換count dnl

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

引用自:https://unix.stackexchange.com/questions/720130