是否可以告诉SHELL
,例如bash,使用.SHELLFLAGS
使用特定的(bash(rc文件?
下面您将看到两个示例。第一个显示了我想做什么,第二个说明了实现预期结果的一种方法。
我问的原因是我有一个bashrc
文件(来自OpenFOAM(,定义了一堆我想在各种配方中使用的变量和函数。
谢谢你的时间。
示例(不工作(
文件:
bashrc
:export HELLOWORLD="Hello World"
文件:
Makefile
:SHELL=/bin/bash .SHELLFLAGS=--rcfile bashrc -- test: @ echo "$${HELLOWORLD}"
示例(工作(
文件:
bashrc
:export HELLOWORLD="Hello World"
文件:
Makefile
:.ONESHELL: SHELL=/bin/bash test: ; source bashrc @ echo "$${HELLOWORLD}"
如果您阅读与--rcfile
选项相关的 bash 手册页,您会发现:
--rcfile file
Execute commands from file instead of the system wide initial‐
ization file /etc/bash.bashrc and the standard personal initial‐
ization file ~/.bashrc if the shell is interactive (see INVOCA‐
TION below).
特别要注意的是,shell 必须是交互式的才能产生任何效果,但进行调用的 shell 当然不是交互式的。
其次,如果你阅读了 GNU make 手册.SHELLFLAGS
你会发现默认值是-c
(或在 POSIX 模式下-ec
(;-c
选项允许 shell 从命令行读取脚本以运行,这就是make
调用 shell 的方式。 这意味着当您将.SHELLFLAGS
替换为自己的值时,您必须包含它。
因此,当您的makefile运行时make
它将使用以下命令行:
/bin/bash --rcfile bashrc -- 'echo "${HELLOWORLD}"'
这显然是行不通的。 您需要像这样设置.SHELLFLAGS
:
.SHELLFLAGS = --rcfile bashrc -ic --
-i
选项强制使用交互式 shell,您需要-c
选项来告诉 make 将第一个非选项参数作为命令运行。