我在 makefile 规则中看到过诸如echo
, mv
, if
, , 之类的东西。for
某种 shell 命令似乎可以被识别。这是狂欢吗?我怎样才能知道正在使用哪个 shell 以及我可用的关键字的完整列表?
答案1
它是sh
:
然后,执行行将由 shell 执行,就好像它作为参数传递给系统()界面
system()
使用sh
.您绝对可以使用以下关键字POSIX Shell 命令语言,以及您希望在主机平台上可用的任何非关键字命令。
sh
在您的系统上实际上可能是不同 shell 的另一个名称(例如bash
),在这种情况下您将有更多可用选项。不过,这种 makefile 是不可移植的。
当您具体询问 GNU make 时,我还会注意到它允许您指定不同的 shell在 makefile 中使用,但是该 makefile 又不能移植到make
.按照 POSIX 的规定, GNU makesh
默认使用。
答案2
你还应该看看PolyGlot 生成文件,关于为特定 makefile 目标选择 shell 的简短说明。
这里为名为 bash 的目标选择 bash:
.ONESHELL:
bash: SHELL := bash
bash:
# note: the double dollar-sign is required because Make substitues $variables
export greeting="¡hola"
echo "$${greeting}, bash!"
这只是炫耀:
.ONESHELL:
python: SHELL := python3
python:
greeting = "hello"
print(f"{greeting}, python!")
因此,make python
然后打印“你好,python!”。
答案3
@Michael (+1) 说了这一切(并给出了细节的指示)。尽管如此,我还是要强调两个细节(请纠正我):
制作动作使用“sh”
如果在 gnumake 中有用,我们可以重新定义 shell
外壳 = bash
并使用 bash 技巧。
(在基于 UNIX 的环境中) --
mv
,echo
是命令(我们可以在任何 shell 中使用它们)if
并且for
是 sh/bash 依赖项。shell 在引用方面有不同的行为(还有 glob 和 var 扩展......),并且
make
也有一些特殊的行为。在 Windows 等中,与安装 gnumake 命令一起,安装某种 Unix 幸存工具包(sh / bash、一些过滤器、fileutils 以及通常在 make 操作中使用的命令)可能会很有用