【问题标题】:Makefile as an executable script with shebang?Makefile作为带有shebang的可执行脚本?
【发布时间】:2023-03-27 09:14:01
【问题描述】:

是否可以创建一个可以被 make 解释的可执行脚本?

我试过了:

#!/usr/bin/env make --makefile=/dev/stdin

main:
        @echo Hello!

但它不起作用 - 挂起直到按下 Ctrl-c

【问题讨论】:

  • 使用@ 为命令添加前缀可能是一种不好的做法。 echo 的例外情况可能没问题。它消除了用户在执行命令时选择是否使用-s 来(不)回显命令的能力。只是说以防初学者从中复制。
  • 我认为这不是一个好主意。如果您考虑过使用 makefile 来执行系统管理员任务,请先阅读以下内容:unix.stackexchange.com/a/497601/1170

标签: makefile shebang


【解决方案1】:
#!/usr/bin/make -f

main:
        @echo Hello World!

通常是您在标准 make 文件中所需要的。文件名作为最后一个参数隐式传递。 /dev/stdin 这里(通常)是 tty。如果有理由,你可以做整个env 的事情,但通常没有必要。

ajw@rapunzel:~/code/videocc/tools > vi Makefile                       
ajw@rapunzel:~/code/videocc/tools > chmod a+x Makefile         
ajw@rapunzel:~/code/videocc/tools > ./Makefile                 
Hello World!

【讨论】:

  • #!/usr/bin/env make -f 给出“/usr/bin/env: make -f: No such file or directory”
  • 当你为 #! 运行 /usr/bin/env 时,你不能依赖使用选项!口译员。如果你不想硬编码路径(并且你没有使用 OSX),那么在第一行使用#! make -f
  • 为什么要包含-f#!/usr/bin/env make 对我来说似乎同样有效。
  • @Taylor 我认为这是 GNU make-ism,例如不适用于 Solaris。无论是那个还是你的测试根本没有按照你的想法做。从我的测试来看,虽然我什至无法做到你似乎用 GNU make 尝试过的那样。
  • @Flexo 你是对的。 $ make --version 显示 GNU Make 4.2.1,我在 macOS 上。这是我正在使用的示例 Makefile - stackoverflow.com/a/53562601/149428。编辑:我应该澄清一下,我是通过查询“makefile shebang”来寻找规范的 make shebang 与 OP 对可执行 makefile 的需要。
【解决方案2】:

以下添加了一个间接级别,但这是我为不称为“makefile”的自执行 makefile 提出的最佳解决方案:

#!/bin/sh
exec make -f- "$@" << 'eof'

.PHONY: all
all:
    @echo 'hello world!'

我正在尝试收集#!每种语言/程序的 env hack here.

【讨论】:

  • 非常有趣,但是当我运行 make 而不是 ./Makefile 时,make 说:Makefile:2: *** missing separator. Stop.
  • @SebMa,您的用例是一个支持默认参数的生成文件,并且是具有相同参数的可执行文件。这个问题只针对后者。我已经更详细地跟进了您在此处打开的票:github.com/niedzielski/shebang/issues/1
  • 我收到警告:warning: here-document at line 2 delimited by end-of-file (wanted `eof')
  • @CMCDragonkai,你复制了顶部的shebang吗?在我的机器上,bash 会打印此警告,而 sh 不会。如果您只有 Bash 可用,您可以尝试将 'eof' 更改为 '#eof' 并在底部附加 #eof
  • 底部需要eof
猜你喜欢
  • 1970-01-01
  • 2011-09-20
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 2012-04-14
  • 2011-06-22
  • 1970-01-01
相关资源
最近更新 更多