是否可以告诉SHELL,例如 bash,使用特定的 (bash)rc 文件.SHELLFLAGS?
您将在下面看到两个示例。第一个显示了我想要做什么,第二个说明了实现预期结果的一种方法。
我问的原因是我有一个 bashrc文件(来自 OpenFOAM)定义了一堆我想在各种配方中使用的变量和函数。
感谢您的时间。
示例(不工作)
文件bashrc::
export HELLOWORLD="Hello World"
Run Code Online (Sandbox Code Playgroud)文件Makefile::
SHELL=/bin/bash
.SHELLFLAGS=--rcfile bashrc --
test:
@\
echo "$${HELLOWORLD}"
Run Code Online (Sandbox Code Playgroud)示例(工作)
文件bashrc::
export HELLOWORLD="Hello World"
Run Code Online (Sandbox Code Playgroud)文件Makefile::
.ONESHELL:
SHELL=/bin/bash
test: ; source bashrc
@\
echo "$${HELLOWORLD}"
Run Code Online (Sandbox Code Playgroud)如果您阅读与该--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).
Run Code Online (Sandbox Code Playgroud)
特别要注意的是,shell 必须是交互式的才能产生任何效果,但是 make 调用的 shell 当然不是交互式的。
其次,如果您阅读 GNU make 手册,.SHELLFLAGS您会看到默认值为-c(或-ec在 POSIX 模式下);该-c选项允许 shell 读取脚本以从命令行运行,这就是make调用 shell 的方式。这意味着当你.SHELLFLAGS用你自己的值替换时,你必须包含它。
因此,在make运行 shell时,您的 makefile将使用以下命令行:
/bin/bash --rcfile bashrc -- 'echo "${HELLOWORLD}"'
Run Code Online (Sandbox Code Playgroud)
这显然行不通。你需要这样设置.SHELLFLAGS:
.SHELLFLAGS = --rcfile bashrc -ic --
Run Code Online (Sandbox Code Playgroud)
该-i选项强制交互式 shell,您需要该-c选项来告诉 make 将第一个非选项参数作为命令运行。