Существует ли когда-либо версия 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 была внешней командой.)
