【问题标题】:Getting GNU Make to parse shell config files in OSX?让 GNU Make 解析 OSX 中的 shell 配置文件?
【发布时间】:2017-11-25 16:21:21
【问题描述】:

我有一个 makefile 用于安装我的个人配置文件仓库,其中一部分是编译我的 emacs 脚本:

compile:
    emacs -batch --eval "(progn (load \"~/.emacs\") (byte-recompile-directory \"~/.emacs.d\" 0))"

问题是,在 OSX 上,我有一个名为“emacs”的别名,它指向在终端中使用的 Emacs.app 二进制文件,这是在我的 ~/.bash_profile 中定义的。

现在,无论我做什么,我似乎都无法让 Make 调用的 shell 读取启动文件以加载该别名,因此编译步骤总是失败。

有人知道怎么做吗?

【问题讨论】:

  • 启动你自己的shell...bash -c ‘emacs ....’
  • 不幸的是没有骰子......
  • 可能是bash —login -c ...?这是双破折号登录。
  • 这与问题所要求的完全相反。通过指定--login,您将强制bash 读取.bash_profile 并设置别名:他想 设置别名。至于第一个建议,make 已经这样做了,所以不会有任何区别。
  • @MadScientist 你是对的,谢谢你让我保持直截了当。

标签: macos makefile gnu-make


【解决方案1】:

.bash_profile 只能由交互式登录 shell 读取。其中设置的导出环境变量是通过进程环境继承的,也就是说这些设置一般对用户启动的所有程序都是可用的(当然如果bash确实是登录shell的话)。

不过,别名不会发生这种继承。 Bash 支持导出函数,但这是一个晦涩难懂的特性,很容易破坏其他程序(例如,那些假定环境变量值不包含换行符的程序)。如果你走这条路,你可能不得不改用.bashrc,以确保这些函数是由不是登录shell的交互式bash shell导出的。

我预计最简单的解决方案是将$HOME/bin 之类的目录放在PATH 上(在.bash_profile.bashrc 中,无论效果如何),然后将emacs 包装脚本放入调用使用exec /path/to/Emacs.app "$@" 的实际二进制文件(或者可能只是一个符号链接就可以了)。

【讨论】:

  • 我怀疑这也是要走的路。
  • 在您弄清楚别名是如何泄漏到您的子 shell 中之前,您将永远无法依赖构建正常工作(或其他调用子 shell 的工具)。这绝对不应该发生:您的 shell 配置或环境有问题。
【解决方案2】:

这很奇怪。别名不会导出到子 shell,.bash_profile 脚本仅由交互式 shell 运行:make 不调用交互式 shell(默认情况下)。因此,很难理解 shell make 调用如何根据您提供的信息看到该别名。

也许你在某处设置了BASH_ENV shell 变量?除非你真的知道自己在做什么,否则你永远不应该这样做。

也许你重置了make的.SHELLFLAGS变量来强制登录shell?你也不应该那样做。

无论如何,你可以尝试使用command 来避免别名等。不幸的是,make 不知道这是一个内置的 shell,所以你必须说服它运行一个 shell。这将在 GNU make 的下一个版本中修复,但 Apple 永远不会发布。

compile:
        command emacs -batch --eval "(progn (load \"~/.emacs\") (byte-recompile-directory \"~/.emacs.d\" 0))" && true

【讨论】:

  • 是的,没有设置 BASH_ENV 或使用 .SHELLFLAGS。它非常固执。
  • 如果你运行“env | grep emacs”你会看到什么?如果你运行“env | grep BASH”,你会看到什么?
  • 对不起,详细说明,它 not 看到我设置的别名,这是问题所在,它默认返回到默认情况下 OSX 附带的 emacs 22,这导致坏事要发生...
  • 人力资源部。好的,我明白了,我完全误解了你的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 2014-05-06
  • 2018-05-06
相关资源
最近更新 更多