输出重定向问题 - 带有自增构建计数器的 m4 宏

输出重定向问题 - 带有自增构建计数器的 m4 宏

我的目标是创建一个 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 > BUILD文件BUILD始终包含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', `')

有没有办法这样做,或者我需要使用其他方法来捕获输出

答案1

BUILD每当您> BUILD 在命令中使用时,在运行 m4 之前,shell 总是会先打开一个空文件,所以这永远不会起作用。

您可以尝试将写入写入BUILDm4 脚本中。例如,将最后一行替换count dnl

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

相关内容