强制GNU make使用特定的shell
我正试图将一个项目移植到一个新系统,但makefile已停止工作。值得注意的是,这两个计算系统具有共享的数据存储 为了处理构建过程,我在make文件中使用了几个强制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/,我也不知道该怎么说。我能找到的与这个主题相关的唯一其他讨论是关于检
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-它打印出什么?