当前位置: 首页>>技术教程>>正文


linux – 所需的 shell 更少

, , ,

问题描述

在我的Ubuntu系统上,/usr/bin/ssh-copy-id在顶部包含一个奇怪的代码。似乎检查/bin/sh是否为”sane shell”。如果不是,它将尝试使用ksh将脚本re-run。如果失败,它将举起手来并显示一条错误消息。

它到底在检查什么?特别是if false ^ printf会做什么,为什么它仅在旧的shell中触发?古代 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" "$@"
  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

最佳方法

原始的伯恩支持^作为管道操作员。它被丢弃在Korn shell中(POSIX sh规范是从Korn shell中获得的),因此是Bourne中可用的功能,而POSIX sh中不可用。

因此,此代码测试POSIX Bourne之前的 shell 。

次佳方法

该部分适用于在/bin/sh不兼容POSIX的Solaris 10及更早版本的Solaris 10上使用的脚本。请注意,后者不是bug,因为POSIX没有指定sh路径应该是什么。

Solaris 10上的/bin/sh(和/sbin/sh)可能是当前操作系统中仅剩余的仍支持这种形式的管道的 shell ,它们出现在原始的Bourne shell 中。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/9752.html,未经允许,请勿转载。