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
나는 이것이 출력 리디렉션과 관련이 있다고 생각합니다 >
. 이 두 변종을 디버그 추적과 비교할 때 동일한 파일로 리디렉션되는 변종은 더 이상 해당 파일에서 읽을 수 없는 것으로 보입니다.
변형이 다른 파일로 리디렉션됩니다.
% 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