내가 할 때마다
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
)과 관련하여 보고 있는 것은 time
bash 내장 명령과 외부 명령 간의 출력 형식의 차이 입니다 /usr/bin/time
.
make는 Makefile의 명령을 에 전달하여 실행합니다 /bin/sh
. 일부 Linux 배포판(주로 Debian 및 Ubuntu)은 dash
내장 명령을 구현하지 않고 time
이런 방식으로 외부 명령을 호출하게 되는 더 간단한 셸입니다. 상황.
time
bash를 사용하여 Makefile에서 명령을 실행하도록 make에게 지시하면 bash 출력을 얻을 수 있습니다. 이는 Makefile에서 변수 할당을 통해 수행할 수 있습니다.
SHELL = /bin/bash