如何解决在所有 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 个或多个命令
-
将管道分解成命令
-
为管道设置 I/O
-
对于每个命令
(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
我忘记了步骤 (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(" ",strlen($y) - strlen($row)),$row,"<br/>";
}
}
MarioFlagpole(5);
可以绕过这些,但不能完全移植到旧 shell。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。