是否存在一个 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
是一个外部命令。