Существует ли когда-либо версия Unix, в которой встроенная оболочка "if" была командой (например, /bin/[
и /bin/test
)?
1 ответ
Очень маловероятно. if
не команда ; это часть синтаксиса оболочки sh , с различными правилами синтаксического анализа , чтобы разрешить списки команд, вложенные 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
Если вы не хотели прибегать к таким вещам, как цитирование ... много цитирования. И это потребовало бы либо переопределения того же самого парсера оболочки внутри 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
внешне. В оболочках тестирование условия состоит из 1) запуска команды и 2) проверки ее кода выхода. Если if
был внешним, ваша оболочка должна была бы делать то же самое, в противном случае она не знала бы if
успешен ли он или нет. (Та же функциональность используется и в условных выражениях ||
и &&
.)
(Помимо: в ранних прототипах Unix chdir
была внешней командой.)