是否存在某个版本的 Unix,其中“if”是 /bin 中的命令?

是否存在某个版本的 Unix,其中“if”是 /bin 中的命令?

是否存在一个 Unix 版本,其中 shell 内置“if”是一个命令(如/bin/[and /bin/test)?

答案1

极不可能。if不是命令;它是shell 语法,不同的解析规则为了允许命令列表、嵌套if等等。

例如,如果以下内容if是命令,那么这显然是不可能的,因为解析器会在此处停止if test -e file;而不考虑其余部分。

if test -e file; then
    echo "File exists"
else
    if touch file; then
        echo "File created"
    else
        echo "File couldn't be created"
    fi
fi

或这个:

if case $path in
   ~/trash/*)  false;;
   ~/*)        true;;
   /proc/*)    false;;
   *)          true;;
esac; then
   backup "$path"
else
   echo "skipping $path"
fi

除非你想诉诸诸如引用之类的东西......大量的引用。要么需要重新实现相同的 shell 解析器里面 if。如果您只是让它生成一个新的imaginarysh -c <argument>,那么就不可能修改命令列表内的变量。

/bin/if "test -e file" "echo \"File exists\"" "if \"touch file\" \"echo File created\" \"echo \\\"File couldn\\\'t be created\\\"\""

(旁白:if实际上是Tcl编程语言,它的工作原理与上面的例子一样,只是使用平衡{ }来引用代码块。)


但再想想,如果if这是命令,修改变量将变得不可能在命令列表中反正if参数内部修改的任何内容都不可能到达主进程。

最后,绝对没有优势外部实现if。在 shell 中,测试条件包括 1) 运行命令,以及 2) 检查其退出代码。如果if是外部的,你的 shell无论如何都得这么做,否则它不知道是成功还是失败。(和条件if中也使用相同的功能。)||&&

(补充:在早期的 Unix 原型中,chdir是一个外部命令

相关内容