출력 리디렉션 문제 - 자동 증가 빌드 카운터가 있는 m4 매크로

출력 리디렉션 문제 - 자동 증가 빌드 카운터가 있는 m4 매크로

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

BUILD3이 포함되면 출력 m4 BUILD.m4이 실행됩니다 4. 정말 좋아요!

그런데 이렇게 호출하면 m4 BUILD.m4 > BUILD파일에는 BUILD항상 1.

다른 파일로 파이프하면 m4 BUILD.m4 > B작동하고 파일에는 was 가 B포함됩니다 .4BUILD3

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

변형이 다른 파일로 리디렉션됩니다.

% 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를 실행하기 전에 항상 빈 파일을 열므로 이 기능은 작동하지 않습니다.

BUILDm4 스크립트에 작성해 볼 수 있습니다 . 예를 들어, 마지막 줄을 다음 count dnl으로 바꿉니다.

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

관련 정보