微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在所有 if 语句中的 `[` 命令之前使用的命令 `builtin`

如何解决在所有 if 语句中的 `[` 命令之前使用的命令 `builtin`

我在整个 shunit2 中都看到了这一点,它旨在最大程度地跨旧的 Bourne 风格的 shell 脚本(请参阅源代码 here):

# Determine if `builtin` command exists.
__SHUNIT_BUILTIN='builtin'
# shellcheck disable=2039
if ! ("${__SHUNIT_BUILTIN}" echo 123 >/dev/null 2>&1); then
  __SHUNIT_BUILTIN=''
fi

# Some more code ...

# ...and Now a check

if ${__SHUNIT_BUILTIN} [ ... ]; then

[ 不是所有 Bourne 风格的 shell 中的特殊内置函数吗? (即ash /bin/bash /bin/dash /bin/ksh /bin/mksh /bin/pdksh /bin/zsh /usr/xpg4/bin/sh /bin/sh /sbin/sh

如果 builtin 存在于 shell 中,您为什么需要编写 if builtin [ ... ]; then?它实际上位于脚本中的每个 if 语句之前。

更新:

@tripleee 在下面给出了正确答案:[ 可以是别名。为了后代,我将 POSIX shell 评估顺序放在这里

  1. 从标准输入中收集管道(称为“管道”)之间的每一行,其中包含 1 个或多个命令

  2. 将管道分解成命令

  3. 为管道设置 I/O

  4. 对于每个命令

    (a) 将命令拆分为标记

    (b) 如果第一个标记是关键字(没有引号或反斜杠)并且 是开头关键字(例如 if{(),然后

    我。在内部为复合命令设置

    二。读取下一个命令并继续直到复合命令关闭

    (c) 根据列表检查每个命令的第一个标记 别名,如果找到,替换别名并返回步骤 (a)

    (d) 执行 波浪号替换(即,将 ~ 替换为 $HOME,如果 ~ 存在)

    (e) 执行变量替换(例如$variable

    (f) 执行命令替换(即$()的)

    (g) 执行算术替换(即$(())的)

    (h) 使用 $IFS 分割从步骤 (e)(g) 转化为更多代币

    (i) 执行文件通配符扩展(即扩展 *?[...] 对)。

    (j) 搜索标记,它们是指向其二进制路径的命令 使用搜索顺序 special built-ins --> functions --> regular built-ins --> $PATH

    (k) 设置 I/O 重定向后运行命令

我忘记了步骤 (c) 发生在步骤 (j) 之前。

解决方法

因为用户可以使用别名或函数隐藏它,而使用 <?php function MarioFlagpole($a){ if(!is_numeric($a)) return "Invalid Input"; $rows = []; $x = 1; for ($i=2; $i <= $a+1; $x += $i,$i++){ $y = $x; for ($j=1; $j < $i; $j++){ $y = $y . ($x + $j); } $rows[] = $y; } foreach($rows as $row){ echo str_repeat("&nbsp;",strlen($y) - strlen($row)),$row,"<br/>"; } } MarioFlagpole(5); 可以绕过这些,但不能完全移植到旧 shell。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。