AXT> Из синтаксиса консольных команд ОС. Чтобы отличать имена файлов от разделителей частей команды и путей к файлам.
Из синтаксиса, но не консольных команд, а вообще. Тут два соображения — либо ключевые слова (те самые зарезервированные символы, либо создание попутных объектов с полным описанием (типа паспортов массивов). Второй случай потребует ещё и нехилого анализа для разбора строки входной, чтобы свернуть в существующие объекты, что в купе со всякими линками становится уж очень неподъёмной задачей. А так в лине том же самом не представляет проблем создать файлы с перенаправлением или трубой.
code text
(evstiomv@opal)/<5>tst:60> ls -l
total 0
(evstiomv@opal)/<5>tst:61> echo aa > pipe\ \|\ test.txt
(evstiomv@opal)/<5>tst:62> ls -l
total 4
-rw-rw-r-- 1 evstiomv cadx 3 Jun 11 14:18 pipe | test.txt
(evstiomv@opal)/<5>tst:63> echo a > in\ \<\ test.txt
(evstiomv@opal)/<5>tst:64> echo a > out\ \>\ test.txt
(evstiomv@opal)/<5>tst:65> ls -l
total 12
-rw-rw-r-- 1 evstiomv cadx 2 Jun 11 14:21 in < test.txt
-rw-rw-r-- 1 evstiomv cadx 2 Jun 11 14:21 out > test.txt
-rw-rw-r-- 1 evstiomv cadx 3 Jun 11 14:18 pipe | test.txt
(evstiomv@opal)/<5>tst:66>
AXT> А как работать в консоли тогда? В конце концов, '/' и '\0' — это и так огромное послабление, требуется дополнительная логика разбора команды, чтобы понять, к примеру, когда | — разделитель, а когда — часть имени.
Да не, никакого послабления нет. '\0' — всегда конец и не волнует.

'/' всегда разделитель. А для '/', '<', '>', '-' зависит от состояния автомата (или символ, или разделитель — т.е. класс символа меняется на ходу при помощи или специального ключа, или esc-символа).