Eu tenho um Makefile simples:
corre : tempo eco foo
Aqui está a saída quando eu o uso:
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
Por que não funciona? Pelo que entendi, time
é a palavra-chave in bash
(a menos que você também tenha instalado o time
programa , o que eu não tenho) e Makefile
usa sh
como o shell padrão, mas tenho esse link sim para bash
. Aqui está outra saída relevante:
$ 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
editar: observe também que /bin
está vinculado a /usr/bin
, portanto, o problema não se deve a uma distinção entre /bin/sh e /usr/bin/sh. Também estou usando o Arch Linux, com a pacman -Syu
atualização mais recente de hoje, 28 de junho de 2019.
Além disso, aqui está o resultado de um hexdump do Makefile:
$ xxd Makefile
00000000: 7275 6e20 3a0a 0974 696d 6520 6563 686f run :..time echo
00000010: 2066 6f6f 0a foo.
Ter
sh
um link simbólico parabash
não significa que invocarsh
será equivalente a invocarbash
.Isto é o que o Archwiki diz:
Isso significa que alguns recursos não estarão disponíveis e você ainda deve escolher
bash
como um shell no seuMakefile
caso precise dos recursos dobash
.Adicione isso como a primeira linha
Makefile
para escolherbash
como shell:Isso deve resolver seu problema.
Mais informações sobre como escolher o shell podem ser encontradas na documentação do GNU Make