GNU make 执行奇怪的 shell

GNU make 执行奇怪的 shell

shell 函数在 GNU make 中,在 Ubuntu 上表现得很奇怪。考虑这个简单的 Makefile:

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

正在make打印

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

奇怪。为什么默认 shell 不知道command内置的 shell?GNU make 调用的默认 shell 到底是什么?根据GNU make 手册

用作 shell 的程序取自变量 SHELL。如果您的 makefile 中未设置此变量,则将使用程序 /bin/sh 作为 shell。

SHELL上面的 Makefile 中没有变量,因此 shell 应该是/bin/sh。但是,/bin/sh从默认 shell 显式运行实际上表现得符合预期,因此一定存在一些差异。

那么真正的问题是什么?它似乎特定于 Ubuntu 中打包的 GNU make,因为前面提到的 Makefile 在其他系统(如 Arch Linux(虽然符号链接/bin/shbash而不是dash))上的行为与预期一致,即它打印TEST1 = /usr/bin/sh

相关内容