В первой статье цикла "От sh до zsh" я говорил о том, что за теперешний синтаксис любого интерпретатора команд UNIX* ответственен никто иной как Стивен Борн, автор шелла для седьмой редакции UNIX.
До того как устроиться в Bell Labs Стивен Борн работал в университете Кэмбриджа, где главным его занятием было создание компилятора для почившего ныне языка Algol68. Свое увлечение Борн перенес и в Bell Labs, сделав синтаксис своего командной интерпретатора похожим на Algol68 (if...fi, case...esac, все это оттуда).
Это известный факт, о котором знают многие и я не стал бы писать целый пост только об этом. Настоящий WTF кроется намного глубже, а именно в исходниках самого sh из седьмой версии UNIX. В частности там есть такой код:
#define IF if( #define THEN ){ #define ELSE } else { #define ELIF } else if ( #define FI ;} #define BEGIN { #define END } #define SWITCH switch( #define IN ){ #define ENDSW } #define FOR for( #define WHILE while( #define DO ){ #define OD ;} #define REP do{ #define PER }while( #define DONE ); #define LOOP for(;;){ #define POOL }
И такой:
LOCAL VOID gsort(from,to) STRING from[], to[]; { INT k, m, n; REG INT i, j; IF (n=to-from)<=1 THEN return FI FOR j=1; j<=n; j*=2 DONE FOR m=2*j-1; m/=2; DO k=n-m; FOR j=0; j=0; i-=m DO REG STRING *fromi; fromi = &from[i]; IF cf(fromi[m],fromi[0])>0 THEN break; ELSE STRING s; s=fromi[m]; fromi[m]=fromi[0]; fromi[0]=s; FI OD OD OD }
Борн "пропитался" языком Alogol настолько, что попытался превратить в него не только язык командного интерпретатора, но и сам Си (кстати, обратите внимание: автор почему-то использовал фигурные скобки для обрамления блока кода вместо использования определенных им же макросов BEGIN и END из языка Algol).
По мотивам блога Руса Кокса.
* Точнее любого born-like shell (g0lden_key :)