【问题标题】:Running a script inside a makefile在生成文件中运行脚本
【发布时间】:2015-08-09 11:01:14
【问题描述】:

我想在这样的 makefile 中运行一个脚本

    all: a b
    a:
        cd ~/trials; \
        . ./sx.sh
    b:
        echo $(bn)

sx.sh 这样做

    export bn=1

发出 make 命令时,我在终端中看不到变量。我的目标是在为这些脚本特定设置编译我的项目之前运行一个脚本。

【问题讨论】:

  • 这里没有回答你的问题,但是相关信息在这里:stackoverflow.com/questions/23843106/…
  • 所以基本上我们不能在makefile中运行脚本来做同样的事情。
  • 明确一点:这与 make 完全无关。在任何(UNIX/POSIX)程序中,子进程都不可能修改其父进程的环境。子 shell 永远不会改变其父 shell 的环境,例如,甚至将 make 排除在等式之外。

标签: shell scripting makefile


【解决方案1】:

你不能假设 make 发出的命令都由同一个 shell 实例化处理。 Make 不会打开 shell 并一个接一个地向它提供命令,也不会将命令保存到文件中然后将其提供给 shell。它通常为每个命令生成一个 shell,如下所示:

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

这意味着你不能改变环境并让它被以后的命令继承。

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

【讨论】:

  • 但我曾经在给出 make 命令之前运行一个 shellscript。子shell如何使用这些变量?
  • @nikhilchaubey make 的子 shell 将从 make 继承,但 make 不能从它自己的子 shell 继承回来。环境变量只能沿树向下继承,而不能向上继承。如果你在运行 make 之前设置,那么它将从调用它的那个 shell 继承,
  • @nikhilchaubey make 像所有进程一样,继承其父进程的环境。在您的普通 shell 中,当您获取脚本并设置变量时,这些变量在当前 shell 会话中设置并且可用于其他脚本/等。在该会话中运行。此外,任何exported 都可用于子进程。
  • @EtanReisner 快照 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多