我正在运行autoconf并将SHELL设置为'/ bin / sh'。 这造成了巨大的问题。如何强制SHELL成为autoconf的'/ bin / bash'?

我正在尝试在osx上运行它,它正在使用linux。 Linux正在使用SHELL = / bin / bash。 osx默认为/ bin / sh。

有帮助吗?

解决方案

我在Solaris上使用GCC遇到了类似的问题 - 我使用'标准'技术:

CONFIG_SHELL=/bin/bash ./configure ...

(或者,实际上,我使用/ bin / ksh,但设置CONFIG_SHELL env var允许您告诉autoconf脚本使用哪个shell。)

我检查了git和gd的配置脚本(它们恰好被提取出来),以检查这不是GCC特有的env var。

其他提示

什么是“巨大的问题”? autoconf非常难以生成配置脚本,该脚本适用于很大比例的shell。如果您有autoconf编写的不可移植的构造示例,请将其报告给autoconf邮件列表。另一方面,如果您遇到的问题是由于您自己的shell中的shell代码不可移植(例如,您正在使用bashisms),那么解决方案是停止使用非可移植代码或要求用户在配置时显式设置SHELL或CONFIG_SHELL。

听起来您遇到的问题是在运行configure的用户环境中。在Linux上,您的用户将SHELL设置为/ bin / bash,但在OS X上,它设置为/ bin / sh。 autoconf生成的configure脚本对其运行的shell进行了一些初始测试,如果提供的shell缺少某些功能,它会尝试使用不同的shell重新执行自己。但是,如果您在configure.ac中引入了非便携式shell代码,那么您违反了autoconf的主要原则之一 - 即配置脚本应该是可移植的。如果你真的想在shell代码中使用bashisms,那么你需要你的用户将SHELL = / bin / bash作为参数传递给configure脚本。这不是autoconf中的错误,但很多人会认为它是项目构建中的错误。

Autoconf应该通过生成可以“在任何地方”运行的脚本来解决可移植性问题。这就是为什么它会产生奇怪的代码,如:

if test X$foo = X ; then ...   # check if foo is empty

而不是:

if [ "$x" = "" ] ; then ...

这种狡猾的代码可能曾经允许这些脚本在某些古老的Ultrix系统或其他任何东西上运行。

由于外壳差异而未运行的配置脚本就像参加一级方程式比赛一样,有10升汽油和三个备用轮胎。

如果您正在使用Autoconf开发配置脚本,并且它对shell是Bash还是OSX shell很敏感,那么您做错了,或者Autoconf人员破坏了某些东西。如果它来自您,请通过使它们可移植来修复您添加到脚本中的任何shell部分。

SHELL在哪里设置?当你想要/ bin / bash时用/ bin / sh运行什么?

配置脚本意味着可以在任何地方运行,甚至可以在野外存在的可怕的破坏和非Bash shell上运行。

修改:究竟是什么问题?

另一个编辑:也许您希望脚本重新执行自己,就像这样。这可能是错误的:

if test "$SHELL" = "/bin/sh" && test -x /bin/bash; then
    exec /bin/bash -c "<*>" "$@"
fi

ln -f / bin / bash / bin / sh

:-P(不,这不是一个严肃的答案。请不要通过这样做来管理您的系统!)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top