Makefile 규칙 작업에서는 'time' 키워드를 사용할 수 없습니다.

Makefile 규칙 작업에서는 'time' 키워드를 사용할 수 없습니다.

간단한 Makefile이 있습니다.

달리다 :
	시간 에코 foo

사용했을 때의 결과는 다음과 같습니다.

$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127

왜 작동하지 않나요? 내가 이해한 대로 time키워드는 다음과 같습니다 bash(또한 설치하지 않은 경우).time 프로그램, 나는 그렇지 않음) 기본 셸로 Makefile사용 하지만 simlink로 연결되어 있습니다 . 다른 관련 출력은 다음과 같습니다.shbash

$ type -a time
time is a shell keyword
$ bash --version
GNU bash, version 5.0.7(1)-release (x86_64-pc-linux-gnu)
$ ls -l "$(which sh)"
lrwxrwxrwx 1 root root 4 Apr 30 05:13 /usr/bin/sh -> bash
$ make --version
GNU Make 4.2.1
$ ls -l /bin
lrwxrwxrwx 1 root root 7 May 23 10:18 /bin -> usr/bin
$ ls -l /bin/sh
lrwxrwxrwx 1 root root 4 Apr 30 05:13 /bin/sh -> bash
$ /bin/sh -c 'time true'

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

편집: /bin에 simlinked되어 있으므로 /usr/bin문제는 /bin/sh와 /usr/bin/sh의 구별로 인한 것이 아닙니다. 또한 저는 pacman -Syu2019년 6월 28일 현재 최신 업데이트가 적용된 Arch Linux를 사용하고 있습니다.

또한 Makefile의 hexdump 결과는 다음과 같습니다.

$ xxd Makefile
00000000: 7275 6e20 3a0a 0974 696d 6520 6563 686f  run :..time echo
00000010: 2066 6f6f 0a                              foo.

답변1

sh심볼릭 링크를 사용한다고 해서 호출이 호출과 동일하다는 bash의미는 아닙니다 .shbash

이것이 바로아키위키말한다:

When Bash, mksh and zsh are invoked with the sh name, 
they automatically become more POSIX compliant.

이는 일부 기능을 사용할 수 없으며 의 기능이 필요한 경우 bash셸로 선택해야 함을 의미합니다 .Makefilebash

셸로 Makefile선택하려면 다음 줄을 첫 번째 줄에 추가하세요 .bash

SHELL := /bin/bash

이렇게 하면 문제가 해결될 것입니다.

쉘 선택에 대한 자세한 내용은 다음에서 확인할 수 있습니다.GNU Make 문서

관련 정보