간단한 Makefile이 있습니다.
달리다 : 시간 에코 foo
사용했을 때의 결과는 다음과 같습니다.
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
왜 작동하지 않나요? 내가 이해한 대로 time
키워드는 다음과 같습니다 bash
(또한 설치하지 않은 경우).time
프로그램, 나는 그렇지 않음) 기본 셸로 Makefile
사용 하지만 simlink로 연결되어 있습니다 . 다른 관련 출력은 다음과 같습니다.sh
bash
$ 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 -Syu
2019년 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
의미는 아닙니다 .sh
bash
이것이 바로아키위키말한다:
When Bash, mksh and zsh are invoked with the sh name,
they automatically become more POSIX compliant.
이는 일부 기능을 사용할 수 없으며 의 기능이 필요한 경우 bash
셸로 선택해야 함을 의미합니다 .Makefile
bash
셸로 Makefile
선택하려면 다음 줄을 첫 번째 줄에 추가하세요 .bash
SHELL := /bin/bash
이렇게 하면 문제가 해결될 것입니다.
쉘 선택에 대한 자세한 내용은 다음에서 확인할 수 있습니다.GNU Make 문서