我有一个 Make 变量:
PASSWORD:=$(shell vault read -field=password test/password)
Run Code Online (Sandbox Code Playgroud)
如果vault未安装,make将打印make: vault: Command not found,但继续执行配方。如果表达式失败,如何使其失败并停止执行?
这是一种方法:
$ cat err.mk
PASSWORD:=$(shell vault read -field=password test/password)
ifndef PASSWORD
$(error PASSWORD not set (maybe vault failed?))
endif
$ make -f err.mk
make: vault: Command not found
err.mk:3: *** PASSWORD not set (maybe vault failed?). Stop.
Run Code Online (Sandbox Code Playgroud)
如果您打算使用某个call函数,并且希望在一个中心位置中止(以便将来的用户不要GET_SECRET忘记检查例如.SHELLSTATUS),我发现这个技巧很实用:
GET_SECRET = $(shell vault read -field=$(1) $(2) || { echo >&2 "Error reading field $(1) from vault path $(2), aborting"; kill $$PPID; })
Run Code Online (Sandbox Code Playgroud)
父make进程因shell错误而被终止。另请参见225542/how-to-make-a-failing-shell-command-interrupt-make和50958731/assign-shell-output-to-variable-or-exit-terminate-makefile