Makefile에서 파일에 액세스할 수 없습니다.

Makefile에서 파일에 액세스할 수 없습니다.

내가 할 때마다

for f in data/*; echo $f; done

터미널에서는 모든 경로를 올바르게 출력합니다.

그러나 위 줄을 makefile에 추가하면 다음과 같이 됩니다.

test:
    for f in data/*; echo $f; done

그런 다음 실행하면 make test파일을 출력하는 대신 항상 빈 문자열을 출력합니다. 디렉터리에 있는 파일/디렉터리 수와 동일한 횟수로 이 작업을 수행하므로 올바르게 반복되는 것처럼 보입니다.

왜 그런 겁니까?

$$f편집: 이렇게 하면 문제가 해결되지만 $f이를 사용하여 명령 시간을 측정하면 잘못된 출력이 발생한다는 것을 알았습니다 .time

편집 #2: 다음은 time 명령의 예입니다.

생성된 파일에서: for f in data/ascending_order/*; do time echo $$f; done

data/ascending_order/01/
0.00user 0.00system 0:00.01elapsed 0%CPU (0avgtext+0avgdata 804maxresident)k
0inputs+0outputs (0major+232minor)pagefaults 0swaps

터미널에서 for f in data/ascending_order/*; do time echo $f; done

data/ascending_order/01

real    0m0.001s
user    0m0.000s
sys     0m0.000s

답변1

첫 번째 문제( echo $f)는 Makefile에서 이스케이프하여 발생합니다 $f.만들다대신 변수껍데기변수를 사용하면 해당 변수가 비어 있게 확장되어 쉘이 echo각 파일에 대해 빈 줄이 있는 단일 변수를 실행하게 됩니다. 해결책은 $a를 두 배로 늘려서, 즉 use를 사용하여 이스케이프하는 것 입니다 $$f. 이 경우 make는 s 중 하나를 소비 하고 원하는 대로 $쉘 a를 전달합니다 .$f


두 번째 질문(output format time)과 관련하여 보고 있는 것은 timebash 내장 명령과 외부 명령 간의 출력 형식의 차이 입니다 /usr/bin/time.

make는 Makefile의 명령을 에 전달하여 실행합니다 /bin/sh. 일부 Linux 배포판(주로 Debian 및 Ubuntu)은 dash내장 명령을 구현하지 않고 time이런 방식으로 외부 명령을 호출하게 되는 더 간단한 셸입니다. 상황.

timebash를 사용하여 Makefile에서 명령을 실행하도록 make에게 지시하면 bash 출력을 얻을 수 있습니다. 이는 Makefile에서 변수 할당을 통해 수행할 수 있습니다.

SHELL = /bin/bash

관련 정보