Eu tenho um Makefile simples:
correr : tempo eco foo
Aqui está a saída quando eu 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 está em bash
(a menos que você também tenha instalado otime
programa, o que não tenho) e Makefile
uso sh
como shell padrão, mas tenho esse link sim para bash
. Aqui estão alguns outros resultados relevantes:
$ 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
edit: 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 pacman -Syu
atualização mais recente a partir 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.
Responder1
Ter sh
um link simbólico para bash
não significa que invocar sh
será equivalente a invocar bash
.
Isso é o queArquiwikidiz:
When Bash, mksh and zsh are invoked with the sh name,
they automatically become more POSIX compliant.
Isso significa que alguns recursos não estarão disponíveis e você ainda deve escolher bash
um shell no seu Makefile
se precisar dos recursos do bash
.
Adicione isto como a primeira linha para Makefile
escolher bash
como shell:
SHELL := /bin/bash
Isso deve resolver seu problema.
Mais sobre como escolher o shell pode ser encontrado ema documentação do GNU Make