这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/sh
到bash
而不是dash
))上的行为与预期一致,即它打印TEST1 = /usr/bin/sh
。