【问题标题】:autoconf using sh, I need SHELL=BASH, how do I force autoconf to use bash?autoconf 使用 sh,我需要 SHELL=BASH,如何强制 autoconf 使用 bash?
【发布时间】:2010-09-14 17:37:14
【问题描述】:

我正在运行 autoconf 并将 SHELL 设置为“/bin/sh”。 这会产生巨大的问题。如何强制 SHELL 为 autoconf 的 '/bin/bash'?

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

【问题讨论】:

    标签: bash unix autoconf sh


    【解决方案1】:

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

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

    (或者,实际上,我使用 /bin/ksh,但设置 CONFIG_SHELL 环境变量可以让您告诉 autoconf 脚本使用哪个 shell。)

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 仅供参考,确实存在 /bin/sh 存在问题的情况。例如,在 AIX 上,使用 /bin/sh 会使构建花费很长时间,因为 /bin/sh 处理典型的配置测试非常非常缓慢。 (可能会在较新的版本中得到修复,我已经有一段时间没有遇到这个特殊问题了。)
      【解决方案3】:

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

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

      而不是:

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

      这种笨拙的代码可能曾经允许这些脚本在一些古老的 Ultrix 系统或其他系统上运行。

      由于外壳差异而无法运行的配置脚本就像是在 10 升汽油和三个备用轮胎的情况下参加一级方程式比赛。

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

      【讨论】:

      • 使用"x$foo"(除了x前缀外加双引号)代替"$foo"与空字符串无关。它与 "$foo" 可能评估为可能看起来像 -f 之类的测试选项的情况有关。
      • 由于外壳差异而无法运行的配置脚本就像驾驶一级方程式赛车参加肥皂盒比赛。
      • @domson 我真的不明白我大约十年前在那里写的类比。但是很明显,如果您的配置脚本由于 shell 差异而被搞砸了,那么面对众多其他系统差异,如何才能完成复杂程序的构建过程的平滑工作。
      • @Kaz 是的,你是绝对正确的。我围绕由 m4 配置、生成的 Makefile 调用的大量 bash 脚本构建了我的 autotool 链,因为我当然知道它的用例不会超出 archlinux 或 alpine linux。所以我只是把你的比喻转了180度说:如果有人想参加你的一级方程式比赛(sh -> bash),即使是一辆肥皂盒车也完全有可能。但不是反过来(bash -> sh)。 OSX 用户可以轻松更改他们的登录 shell。 Formula-1 不向后兼容,但 Autotools 是有充分理由的!
      【解决方案4】:

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

      配置脚本可以在任何地方运行,即使是在野外存在的严重损坏的非 Bash shell 上也是如此。

      编辑:究竟是什么问题?

      另一个编辑:也许您希望脚本重新执行自身,类似这样。可能有问题:

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

      【讨论】:

      • 问题是有时配置脚本需要 Bourne shell 不支持的语法。配置脚本已损坏,但这就是软件行业的生活。此时,您需要说服 Configure 使用正确的 shell 运行 - 正如我所指出的那样,这需要 CONFIG_SHELL。
      【解决方案5】:

      ln -f /bin/bash /bin/sh

      :-P(不,这不是一个严肃的答案。请不要这样做!)

      【讨论】:

      • 你可以随心所欲地给我投反对票;它只是证明你没有幽默感。 :-P
      猜你喜欢
      • 1970-01-01
      • 2021-05-28
      • 1970-01-01
      • 2017-02-06
      • 2014-04-27
      • 2017-02-17
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      相关资源
      最近更新 更多