【问题标题】:Force GNU make to use a specific shell强制 GNU make 使用特定的 shell
【发布时间】:2026-02-19 01:35:02
【问题描述】:

我正在尝试将项目移植到新系统,但生成文件已停止工作。需要注意的是,这两个计算系统共享数据存储。

为了兼顾构建过程,我在 make 文件中使用了几个 shell 调用。在新系统上,这会导致错误

make: /usr/bin/sh: Command not found

在新系统上,shell 可执行文件位于/bin/,而在旧系统上则位于/usr/bin。我没有明确告诉 make 查看/usr/bin/,我不知道如何告诉它。我能找到的与该主题相关的唯一其他讨论是关于检测存在哪个 shell,而不是帮助 GNU 找到正确的 shell。

How to detect shell used in GNU make?

关于如何解决这个问题的任何想法?

【问题讨论】:

  • 非常非常令人惊讶的是,有一个系统没有/bin/sh 可用。几乎每个曾经编写的 shell 脚本都包含 #!/bin/sh 和顶部,如果 /bin/sh 不存在,它们都不会起作用。
  • 系统确实有/bin/sh,但由于某种原因make正在搜索/usr/bin/sh

标签: shell makefile gnu-make


【解决方案1】:

使用SHELL 环境变量。在调用 make 之前将其设置在环境 (export SHELL=/bin/sh) 中,或者将 SHELL=/bin/sh 放在 make 命令行中。

问题实际上可能是您在新系统上的启动文件(.profile 或 .login 等)中错误地设置了SHELL=/usr/bin/sh,这将导致任何尝试使用它的程序出现问题,而不是做吧。

【讨论】:

  • Make 永远不会使用用户的SHELL 设置(这将是可移植性的灾难),因此启动文件等中的设置不是问题。Make 始终使用/bin/sh 作为@ 的设置无论用户的SHELL 变量设置为什么,默认情况下都是 987654327@。如果他看到/usr/bin/sh,那么他一定是在他的makefile 中明确添加了SHELL = /usr/bin/sh。这就是问题所在:应该删除该行。
  • 我没有在我的 bashrc 或 makefile 中的任何地方显式设置SHELL=,并且在两个系统中检查echo $SHELL 都会得到/bin/bash 的预期结果。尽管如此,使用make SHELL=/bin/bash 可以解决此问题。我不知道为什么 make 会倾向于覆盖环境变量,但这确实解决了我的问题。
  • 运行这个命令:echo 'all:;@echo $(SHELL)' | make -f- 它打印出什么?