linux - 一落千丈反義詞 - 吃力反義詞




需要更少的笨重的外壳 (2)

在我的Ubuntu系统上, /usr/bin/ssh-copy-id在顶部包含一段奇怪的代码。 它似乎检查/bin/sh是一个“理智的shell”。 如果不是,它会尝试使用ksh重新运行脚本。 如果失败,它会抛出手并显示错误消息。

它究竟在检查什么? 特别是, if false ^ printf怎么做,为什么它只在旧shell中触发? 古代的炮弹是用来拥有一个XOR算子,还是什么?

#!/bin/sh
# ...
# check that we have something mildly sane as our shell, or try to find something better
if false ^ printf "%s: WARNING: ancient shell, hunting for a more modern one... " "$0"
then
  SANE_SH=${SANE_SH:-/usr/bin/ksh}
  if printf 'true ^ false\n' | "$SANE_SH"
  then
    printf "'%s' seems viable.\n" "$SANE_SH"
    exec "$SANE_SH" "$0" "[email protected]"
  else
    cat <<-EOF
        oh dear.

          If you have a more recent shell available, that supports \$(...) etc.
          please try setting the environment variable SANE_SH to the path of that
          shell, and then retry running this script. If that works, please report
          a bug describing your setup, and the shell you used to make it work.

        EOF
    printf "%s: ERROR: Less dimwitted shell required.\n" "$0"
    exit 1
  fi
fi

原Bourne支持^作为管道操作员。 这被删除在Korn shell中(POSIX sh规范派生自那里),因此是Bourne中可用的功能,但在POSIX sh中没有。

因此,此代码测试pre-POSIX Bourne shell。


这部分用于脚本在Solaris 10及更早版本上工作,其中/bin/sh不符合POSIX。 请注意,后者不是错误,因为POSIX没有指定sh路径应该是什么。

Solaris 10上的/bin/sh (和/sbin/sh )可能是当前操作系统中唯一仍然支持这种形式的管道的shell,它出现在最初的Bourne shell中。







sh