Рейтинг:1

GNU make executes weird shell

флаг cn

The shell function in GNU make behaves weird on Ubuntu. Consider this simple Makefile:

TEST1 := $(shell command -v sh)
TEST2 := $(shell /bin/sh -c 'command -v sh')
all:
        $(info TEST1 = $(TEST1))
        $(info TEST2 = $(TEST2))

Running make prints

make: command: Command not found
TEST1 = 
TEST2 = /usr/bin/sh

Weird. Why does the default shell not know the command built-in? And what is the default shell invoked by GNU make actually? According to the GNU make manual:

The program used as the shell is taken from the variable SHELL. If this variable is not set in your makefile, the program /bin/sh is used as the shell.

There is no SHELL variable in the Makefile above, so the shell should be /bin/sh. However, running /bin/sh explicitly from the default shell actually behaves as expected, so there must be some difference.

So what is the real problem? It seems to be specific to GNU make packaged in Ubuntu, since the aforementioned Makefile behaves as expected on other systems like Arch Linux (which symlinks /bin/sh to bash rather than dash, though), i.e. it prints TEST1 = /usr/bin/sh.

флаг hr
Хм... интересно. Основываясь на выводе `strace`, кажется, что оболочка вообще не используется (вместо того, чтобы передать команду + args в `execve` напрямую), либо когда переменная make `SHELL` не определена **или** установлена ​​в `/bin/sh `. Кажется, можно обмануть его, заставив использовать `sh` в системах, где /bin и /usr/bin связаны символическими ссылками, установив `SHELL=/usr/bin/sh`.
Jakub Klinkovský avatar
флаг cn
Arch Linux также символически связывает `/bin` с `/usr/bin`, и он прекрасно работает как с `SHELL := /bin/sh`, так и без него. Итак, в чем разница между использованием `SHELL := /bin/sh` и `SHELL := /usr/bin/sh` в Ubuntu?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.