是否可以告诉SHELL
,例如bash,使用.SHELLFLAGS
?
下面你将看到两个例子。第一部分展示了我想要做的事情,第二部分展示了实现理想结果的一种方式。
我问的原因是我有一个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}"
答案 0 :(得分:4)
如果您阅读了与--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当然不是交互式的。
其次,如果您在.SHELLFLAGS
上阅读GNU make手册,您会看到默认值为-c
(或POSIX模式下的-ec
); -c
选项允许shell从命令行读取脚本,这就是make
调用shell的方式。这意味着当您使用自己的值替换.SHELLFLAGS
时,您必须包含该值。
因此,当make
运行shell时,使用makefile,它将使用以下命令行:
/bin/bash --rcfile bashrc -- 'echo "${HELLOWORLD}"'
显然不会起作用。您需要像这样设置.SHELLFLAGS
:
.SHELLFLAGS = --rcfile bashrc -ic --
-i
选项强制使用交互式shell,您需要使用-c
选项告诉make将第一个非选项参数作为命令运行。