在makefile中运行脚本

5
我希望能在makefile中运行一个脚本,就像这样:
    all: a b
    a:
        cd ~/trials; \
        . ./sx.sh
    b:
        echo $(bn)

sx.sh是这样做的

    export bn=1

在执行make命令时,我在终端中看不到变量。我的目标是在编译项目之前运行脚本以进行特定设置。


1
这并不回答你的问题,但相关信息在这里:https://dev59.com/I2Ag5IYBdhLWcg3wOoxQ - Ben Hocking
基本上我们不能在makefile中运行脚本以执行相同的操作。 - nikhil chaubey
只是为了明确:这与make绝对没有任何关系。在任何(UNIX/POSIX)程序中,子进程都无法修改其父进程的环境。例如,即使不考虑make,子shell也永远无法更改其父shell的环境。 - MadScientist
1个回答

4

您不能假定由Make发出的命令都是由同一个shell实例处理的。Make不会打开一个shell并逐个提供命令,也不会将命令保存到文件中再将其提供给shell。它通常为每个命令生成一个shell实例,类似于这样:

$(SHELL) -c 'cd ~/trials; . ./sx.sh'

这意味着您不能更改环境并使其被后续命令继承。

最好的方法是使用make变量来存储您希望传递给命令的具体信息,并在适当的地方使用这些变量。


但在执行make命令之前,我曾经运行过一个shell脚本。这些变量是如何被子shell使用的? - nikhil chaubey
@nikhilchaubey make 的子 shell 会从 make 继承,但 make 不能从自己的子 shell 继承。环境变量只能向下继承,而不能向上继承。如果在运行 make 之前设置,它将从调用它的 shell 继承。 - Brian Tompsett - 汤莱恩
1
@nikhilchaubey make,像所有进程一样,继承了其父进程的环境。在您的常规 shell 中,当您源码一个脚本并设置变量时,这些变量将在当前 shell 会话中设置,并可供其他在该会话中运行的脚本等使用。此外,任何被export的内容都可以供子进程使用。 - Etan Reisner
@EtanReisner 拍照 :-) - Brian Tompsett - 汤莱恩

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接