使用 sh 的 autoconf,我需要 SHELL=BASH,如何强制 autoconf 使用 bash?

8

我正在运行autoconf和configure将SHELL设置为'/bin/sh'。

这会导致巨大的问题。如何强制SHELL对于autoconf是'/bin/bash'呢?

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

5个回答

10

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

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

(实际上,我使用/bin/ksh,但设置CONFIG_SHELL环境变量可以告诉autoconf脚本要使用哪个shell。)
我检查了git和gd的配置脚本(它们恰好被提取出来),以确定这不是GCC特定的环境变量。

5
什么是“巨大的问题”?autoconf非常努力地生成一个能够与绝大多数shell配合使用的配置脚本。如果您有autoconf编写的不可移植代码的示例,请将其报告给autoconf邮件列表。另一方面,如果您遇到的问题是由于configure.ac中自己的shell代码不可移植(例如,您正在使用bashisms),那么解决方案要么停止使用不可移植代码,要么要求用户在配置时显式设置SHELL或CONFIG_SHELL。
听起来您遇到的问题是运行configure的用户环境问题。在Linux上,您的用户将SHELL设置为/bin/bash,但在OS X上,它设置为/bin/sh。由autoconf生成的配置脚本对其正在运行的shell进行了一些初始测试,并尝试使用不同的shell重新执行自身,如果提供的shell缺少某些功能。然而,如果您在configure.ac中引入了不可移植的shell代码,则违反了autoconf的主要理念之一——即配置脚本应该是可移植的。如果您真的想在shell代码中使用bashisms,那么您需要要求用户将SHELL=/bin/bash作为参数传递给配置脚本。这不是autoconf的错误,但许多人认为这是您的项目构建中的一个错误。

只是提供信息,确实存在/bin/sh会出现问题的情况。例如,在AIX上使用/bin/sh可能会导致构建需要很长时间,因为/bin/sh处理configure-typical测试非常缓慢。(在更新版本中可能已经修复了这个问题,因为我遇到这个特定问题已经有一段时间了。) - DevSolar

2

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

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

而不是:

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

那种混乱的代码可能曾经允许这些脚本在某个古老的Ultrix系统或其他系统上运行。
因为shell的差异导致配置脚本无法运行,就像带着10升汽油和三个备用轮胎来参加一场F1比赛。
如果你正在使用Autoconf开发配置脚本,并且它对Bash或OSX shell敏感,那么你正在做错事情,或者是Autoconf的问题。如果是你添加到脚本中的shell部分有问题,请将其改为可移植的。

使用"x$foo"(除了x前缀外还有双引号)而不是"$foo"与空字符串无关。这与"$foo"可能会计算为类似于-f的测试选项的情况有关。 - adl
一个由于 shell 差异而无法运行的配置脚本就像开着一辆 F1 赛车来参加板条箱比赛。 - domson
@domson,我真的不太理解我十年前写的比喻。但很明显,如果您的配置脚本因为 shell 差异而出现问题,那么在面对众多其他系统差异的情况下,它如何能够顺利地完成复杂程序的构建过程呢? - Kaz
@Kaz 是的,你说得完全正确。我围绕着大量由m4配置生成的Makefile调用的bash脚本构建了我的自动化工具链,因为我肯定知道它的使用情况不会超出archlinux或alpine linux。 所以我只是把你的比喻扭转了180度,说:如果有人想参加你的F1赛车比赛(sh->bash),即使只有一个玩具车,也完全可以达成。但反之则不行(bash->sh)。 OSX用户可以轻松更改其登录shell。 F1并不向后兼容,但Autotools有充分的理由这样设计! - domson

0

SHELL 是在哪里设置的?当您想要 /bin/bash 时,使用 /bin/sh 运行什么?

配置脚本旨在在任何地方运行,即使在野外存在着糟糕的和非 Bash shell。

编辑:问题到底是什么?

另一个编辑:也许您想让脚本重新执行自己,类似于这样。它可能有漏洞:

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

问题在于有时候Configure脚本需要Bourne shell不支持的语法。Configure脚本出问题了,但这就是软件行业的生活。在这种情况下,您需要说服Configure使用正确的shell运行 - 这需要像我指出的那样的CONFIG_SHELL。 - Jonathan Leffler

-6

ln -f /bin/bash /bin/sh

:-P(不,这不是一个严肃的答案。请不要通过执行上述命令来破坏你的系统!)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接