强制GNU make使用特定的shell

强制GNU make使用特定的shell,shell,makefile,gnu-make,Shell,Makefile,Gnu Make,我正试图将一个项目移植到一个新系统,但makefile已停止工作。值得注意的是,这两个计算系统具有共享的数据存储 为了处理构建过程,我在make文件中使用了几个shell调用。在新系统上,这会导致错误 make: /usr/bin/sh: Command not found 在新系统上,shell可执行文件位于/bin/中,在旧系统上,shell可执行文件位于/usr/bin中。我还没有明确告诉make去查看/usr/bin/,我也不知道该怎么说。我能找到的与这个主题相关的唯一其他讨论是关于检

我正试图将一个项目移植到一个新系统,但makefile已停止工作。值得注意的是,这两个计算系统具有共享的数据存储

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

make: /usr/bin/sh: Command not found
在新系统上,shell可执行文件位于
/bin/
中,在旧系统上,shell可执行文件位于
/usr/bin
中。我还没有明确告诉make去查看
/usr/bin/
,我也不知道该怎么说。我能找到的与这个主题相关的唯一其他讨论是关于检测哪个shell存在,而不是帮助GNU找到正确的shell


关于如何解决这个问题有什么想法吗?

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


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

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


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

这非常,非常令人惊讶的是,有一个系统没有可用的
/bin/sh
。几乎所有编写的shell脚本都包含
#/bin/sh
和顶部,如果
/bin/sh
不存在,它们都不会工作。系统确实有
/bin/sh
,但出于某种原因,
make
正在搜索
/usr/bin/sh
,非常令人惊讶的是,有一个系统没有可用的
/bin/sh
。几乎所有编写的shell脚本都包含
#/bin/sh
和顶部,如果
/bin/sh
不存在,它们都不会工作。系统确实有
/bin/sh
,但出于某种原因,
make
正在搜索
/usr/bin/sh
make从不使用用户设置的
SHELL
(这对便携性来说是一场灾难)因此,启动文件等中的设置没有问题。默认情况下,Make始终使用
/bin/sh
作为
SHELL
的设置,无论用户的
SHELL
变量设置为什么。如果他看到的是
/usr/bin/sh
,那么他必须明确地将
SHELL=/usr/bin/sh
添加到他的makefile中。这就是问题所在:应该删除该行。我没有在bashrc或makefile中的任何位置显式设置
SHELL=
,在两个系统中选中
echo$SHELL
都会得到预期的
/bin/bash
。尽管如此,使用
makeshell=/bin/bash
解决了这个问题。我不知道为什么make会覆盖环境变量,但这确实解决了我的问题@echo$(SHELL)| make-f-打印出什么?make从不使用用户设置的
SHELL
(这对便携性来说是一场灾难)因此,启动文件等中的设置没有问题。默认情况下,Make始终使用
/bin/sh
作为
SHELL
的设置,无论用户的
SHELL
变量设置为什么。如果他看到的是
/usr/bin/sh
,那么他必须明确地将
SHELL=/usr/bin/sh
添加到他的makefile中。这就是问题所在:应该删除该行。我没有在bashrc或makefile中的任何位置显式设置
SHELL=
,在两个系统中选中
echo$SHELL
都会得到预期的
/bin/bash
。尽管如此,使用
makeshell=/bin/bash
解决了这个问题。我不知道为什么make会覆盖环境变量,但这确实解决了我的问题@echo$(SHELL)| make-f-它打印出什么?