我的目标是创建一个 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
文件将包含4
when BUILD
was 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 总是会先打开一个空文件,所以这永远不会起作用。
您可以尝试将写入写入BUILD
m4 脚本中。例如,将最后一行替换count dnl
为
syscmd(`echo 'count` >BUILD')dnl