3

Существует ли когда-либо версия Unix, в которой встроенная оболочка "if" была командой (например, /bin/[ и /bin/test)?

1 ответ1

3

Очень маловероятно. 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 была внешней командой.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .