Tengo un Makefile simple:
correr : tiempo eco foo
Aquí está el resultado cuando lo uso:
$ make run
time echo foo
make: time: Command not found
make: *** [Makefile:2: run] Error 127
¿Por qué no funciona? Según tengo entendido, time
es la palabra clave en bash
(a menos que también haya instalado eltime
programa, que no tengo), y Makefile
lo usa sh
como shell predeterminado, pero lo tengo vinculado de forma simultánea a bash
. Aquí hay otros 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
editar: tenga en cuenta también que /bin
está vinculado simultáneamente a /usr/bin
, por lo que el problema no se debe a una distinción entre /bin/sh y /usr/bin/sh. También estoy usando Arch Linux, con la última pacman -Syu
actualización a partir de hoy 28 de junio de 2019.
Además, aquí está el resultado de un volcado hexadecimal del Makefile:
$ xxd Makefile
00000000: 7275 6e20 3a0a 0974 696d 6520 6563 686f run :..time echo
00000010: 2066 6f6f 0a foo.
Respuesta1
Tener sh
un enlace simbólico a bash
no significa que invocar sh
será equivalente a invocar bash
.
Esto es lo queArchiwikidice:
When Bash, mksh and zsh are invoked with the sh name,
they automatically become more POSIX compliant.
Eso significa que algunas funciones no estarán disponibles y aun así deberás elegirlas bash
como shell en tu Makefile
si necesitas las funciones de bash
.
Agregue esto como la primera línea para Makefile
elegir bash
como shell:
SHELL := /bin/bash
Esto debería resolver tu problema.
Puede encontrar más información sobre la elección del caparazón enla documentación de GNU Make