Сегодня многие полагают, что «Unix» и «Linux» — это одно и то же. Но по состоянию на 2024 год с большинством дистрибутивов, которые мы причисляем к «Unix» и «Linux» ситуация почти так и обстоит.
Но у Unix долгая история. Если у вас в распоряжении только известные сейчас системы Linux, то сложно размышлять о том «какова была ситуация на заре Unix», поскольку так много с тех пор изменилось.
❯ От прототипа до Unix
Сделаем шаг назад и рассмотрим, с чего начинался Unix. В 1969 году Кен Томпсон, сотрудник-исследователь из лаборатории «Bell Labs» экспериментировал в области проектирования операционных систем.
Тогда в Bell Labs имелся PDP-7, компьютер с интересной периферией: у него был очень быстрый (по тем временам) дисковый накопитель. Томпсон заинтересовался, на какую максимальную пропускную способность может выйти этот дисковод при обработке данных, поэтому написал собственную программу, служившую интерфейсом для жёсткого диска. Это была серьёзная задача: в те времена всё программировали на ассемблере, а для того, чтобы создать драйвер жёсткого диска, требовалась масса низкоуровневого кода.
В какой-то момент Томпсон осознал: в этот интерфейс уже вложено столько труда, что программу практически можно считать полноценным ядром операционной системы. Он посчитал, что ещё три недели — и он доведёт ядро до ума. Неделю на создание нового редактора, неделю на работу с ассемблером и ещё неделю, чтобы написать прототип ядра. Именно с этого прототипа и начинается история операционной системы Unix.
Этот ранний прототип и заложенные в нём идеи показались интересными, и Томпсон вместе с коллегами по Bell Labs принялся его развивать. Единственный паттерн проектирования в новой системе заключался в следующем: нужно много полезных инструментов, каждый из которых сфокусирован на решении ровно одной задачи. Брайан Керниган, ещё один исследователь из Bell Labs, предложил назвать новую систему «Unix» — как бы в противовес операционной системе «Multics», которой компания Bell Labs также занималась несколькими годами ранее. Но проект «Multics» не удался из-за того, что та операционная система получалась чрезмерно сложной.
❯ Ранний Unix
К ноябрю 1971 года «Bell Labs» собрала программы для новой операционной системы, и так был создан «Unix, 1-я редакция» (Unix 1st Edition). За ней последовали Unix 2nd Edition в июле 1972 года, Unix 3rd Edition в феврале 1973 года и Unix 4th Edition в ноябре 1973 года.
Эти ранние версии Unix не слишком отличались от современных систем Linux. Многие команды, на которые мы сегодня полагаемся при работе с Linux, присутствовали уже в Unix 2nd Edition. Например, команда cat для отображения файлов, команды mkdir
и rmdir
для управления каталогами, cp
, mv
и rm
для управления файлами, chmod
и chown
для управления доступом к файлам. Командами df и du можно было проверять, как используется дисковое пространство, а команды ls
и chdir
(подобная cd) обеспечивали навигацию по файлам. Была уже и масса других знакомых нам команд, в частности, cmp,
date
, echo
, find
, ln
, man
, mount
и umount
, sort
, wc
и who
.
Вот удобная справка по всем командам из раздела 1, взятая из мануала по Unix 4th Edition. Этот мануал был разбит на разделы, и в первом разделе рассматривались пользовательские команды общего назначения:
-
Пользовательские команды;
-
Системные вызовы;
-
Процедуры для программирования;
-
Специальные файлы;
-
Форматы файлов;
-
Программы, поддерживаемые пользователем;
-
Разное;
-
Поддержка.
Возможно, многие из этих команд вам знакомы. Большинство из них сохранились и в современных Linux-системах, но некоторые были заменены другими, которые функционально практически не отличаются от старых. Например, для архивации ранее применялась команда ar, а вы используете для архивации zip
или tar
.
Команда: |
Что делает: |
ar |
Создание архивов |
cat |
Конкатенация файлов |
chdir |
Переход в другой каталог |
chmod |
Изменение режима |
cmp |
Сравнение файлов |
comm |
Вывод обычных строк |
cp |
Копирование файлов |
date |
Вывод даты |
dc |
Настольный калькулятор |
du |
Использование диска |
echo |
Вывод результатов |
ed |
Редактор |
exit |
Выход из командной оболочки |
file |
Вывод типа файла |
goto |
Команда для работы со сценариями оболочки |
grep |
Поиск текста |
if |
Команда для работы со сценариями оболочки |
kill |
Завершение процессов |
ln |
Создание ссылок |
login |
Вход в систему |
ls |
Составление списка файлов |
|
Отправка электронного сообщения |
man |
Страницы справки |
merge |
Комбинирование файлов |
mesg |
Разрешение сообщений или отказ от них |
mkdir |
Создание каталогов |
mv |
Перемещение файлов |
nice |
Работа в низкоприоритетном режиме |
nohup |
Выполнение команды без зависаний |
nroff |
Подготовка документа (замена для roff) |
passwd |
Установка пароля |
pr |
Печать файлов |
ps |
Статус процесса |
rm |
Удаление файлов |
rmdir |
Удаление каталогов |
roff |
Подготовка документа (заменена nroff) |
sh |
Командная оболочка |
shift |
Корректировка аргументов командной строки |
sleep |
Дождаться интервала |
sort |
Сортировка файла |
split |
Разбиение файла |
stty |
Установка опций TeleType |
sum |
Контрольная сумма |
time |
Сколько времени требуется на выполнение команды |
tr |
Транслитерация текста |
troff |
Обработчи кдокументов |
tty |
Получение имени TeleType |
uniq |
Удаление повторяющихся строк |
wait |
Ожидание, пока задача будет выполнена до конца |
wc |
Подсчет слов |
who |
Список пользователей, которые на данный момент вошли в систему |
write |
Отправить сообщение пользователю через строку терминала |
А вот и другие команды из раздела 1, которые полезны при программировании.
Команда: |
Что делает: |
as |
Ассемблер |
bas |
Программирование на BASIC |
cc |
Компилятор C |
cdb |
Отладчик C |
cref |
Список с перекрёстными ссылками |
db |
Отладчик |
fc |
Компилятор FORTRAN |
ld |
Линковщик |
nm |
Вывести список имён |
od |
Восьмеричный дамп |
size |
Размер объектного файла |
sno |
Интерпретатор SNOBOL |
strip |
Удалить символы |
А вот команды, содержавшиеся в разделе 1 в версии Unix 4th Edition, специфичные для рабочего окружения компании Bell Labs. Если вы какие-то из них не узнаёте, то потому, что со временем от них было решено отказаться:
Команда: |
Что делает: |
catsim |
Симуляция фотонаборного автомата в окне терминала |
dsw |
Интерактивное удаление |
fed |
Редактор официальных писем |
form |
Генератор официальных писем |
opr |
Оффлайновый вывод в Honeywell 6070 |
pfe |
Вывод исключений при операциях над числами с плавающей точкой |
plot |
Построение графиков в окне терминала |
proof |
Сравнение текстовых файлов (подобно diff) |
rew |
Перемотка магнитной ленты |
speak |
Преобразование текста в речь |
tp |
Управление магнитными лентами |
tss |
Подключение к MH-TSS на Honeywell 6070 |
type |
Печать файлов на TeleType как на пишущей машинке |
typo |
Поиск ошибок правописания |
Также в ранних версиях Unix существовали и другие команды, которые сохранились до наших дней, но используются нечасто — например, ar
для архивации файлов, dc
— настольный калькулятор, ed
для редактирования файлов и sum
для вычисления контрольных сумм. В версии Unix 2nd Edition также поддерживалась одна из ранних концепций электронной почты (для работы с ней существовала команда mail
) и своеобразный мессенджер: при помощи команд mesg
и write
можно было обмениваться сообщениями с другими пользователями через терминал.
Программисты, работавшие с ранними версиями Unix, пользовались разнообразными компиляторами и инструментами, при помощи которых было удобно создавать новые программы. Так, команда as
использовалась для сборки программ, bas
для программирования на BASIC, ещё были команды cc
(компилятор C), db
(отладчик), fc
(компилятор FORTRAN), ld
(линковщик), nm
(список имён), od
(восьмеричный дамп), strip
(удаление символов) и un
(нахождение неопределённых символов). Возможно, вы узнаете эти инструменты в современных системах Linux, но многие из них теперь называются иначе. Например, для компиляции программ на C применяется команда gcc
.
Некоторые команды Unix со временем изменились, но их ранние версии вполне узнаваемы в Unix 2nd Edition. В оболочке sh
поддерживались ранние версии меток, goto
и операторов if
. Возможно, вы привыкли работать в командной оболочке с Bash, так как язык Bash умеет всё это и многое другое. Программа roff
использовалась для подготовки документов и представляла собой упрощённую реализацию на основе программы RUNOFF, появившейся несколькими годами ранее. Команды check
и salve
обеспечивали примерно такие же проверки файловой системы, как fsck
, команда dsw
удаляла файлы как rm -i
, команда istat
выдавала статус индексного дескриптора, m6
был одним из первых обработчиков макрокоманд и походил на современный m4
, а tm
отображала системное время и информацию о том, как долго система остаётся активна.
Другие команды из этого раннего Unix долгое время сохранялись в качестве реликтов и применялись для поддержки систем, которые сегодня уже не существуют. Например, в мануале Unix 2nd Edition описаны инструменты для коммуникации с мейнфреймом Honeywell 6070, в том числе dpd
(служба для передачи данных по телефону), tss
(связь с системой, работающей с разделением времени) и opr
(«оффлайновый» вывод файлов на печать в систему Honeywell 6070).
❯ Обработка текста
После первой версии Unix Томпсон пытался изобрести более мощную систему, которая позволила бы продолжать работу с Unix. К сожалению, его руководство не желало вкладываться в исследование операционных систем, поскольку компания уже обожглась на неудачном партнёрстве с Multics. Запрос на приобретение новой компьютерной системы был отклонён.
Но команда Unix всё-таки выкрутилась. Примерно в то же время юридический отдел собирался приобрести новую систему подготовки документов, чтобы с её помощью можно было подавать заявки на патенты, а такие заявки требовали специфического форматирования. Но новая программа, которую они хотели купить, ещё была не готова. Команда Unix предложила сделку: патентный отдел купит для них новый PDP-11, а специалисты по Unix, в свою очередь, обновят текстовый процессор roff
, реализовав в нём все недостающие детали, нужные для подготовки патентных заявок.
Причём, технически при этом никто не будет заниматься исследованием операционных систем.
Вот почему в версию Unix 2nd edition также вошло много инструментов для обработки документов и вывода их на печать, в том числе, nroff
(новая версия roff
), ov
для наложения печатных страниц, pr
для предпечатной подготовки и type
для печати страниц на аппарате TeleType как на пишущей машинке.
Позже, когда компания приобрела фотонаборный аппарат, команда Unix переписала nroff, превратив её в troff
(наборная версия roff
) — эта команда вошла в Unix 4th Edition. Другие инструменты для работы с текстом также поддерживали troff
. Например, инструмент eqn
генерировал уравнения для научных документов и tbl
для форматирования таблиц.
Другие возможности Unix, которые сегодня воспринимаются как должное, появились в более поздних версиях Unix. Характерный пример — это возможность передавать одну команду в качестве ввода для другой при помощи конвейеров. Такая функция впервые появилась в Unix 3rd Edition. При помощи конвейеров появилась возможность создавать новые программы, работавшие в качестве фильтров. Такова, например, команда grep
, позволяющая сопоставлять текстовые файлы и искать в них совпадения (Unix 4th Edition) и tee
для сохранения промежуточного вывода конвейеризованных команд (Unix 5th Edition). В версии Unix 7th Edition команда sh
, наконец, была заменена на Bourne Shell с гораздо более разнообразными функциями.
❯ Общие корни в Unix
Мы нечасто задумываемся о происхождении команд Linux, используемых в повседневной практике. Эти команды возникли во времена, когда компьютеры были медленными, а память исчислялась килобайтами. Инструменты приходилось делать маленькими и строго специализированными.
Особенно сильно от исходного Unix до современных дистрибутивов Linux изменился разброс доступных опций командной строки. Когда компьютеры стали гораздо быстрее, и памяти стало больше, каждый инструмент стал брать на себя всё больше и больше работы. Например, команда ls
из версии Unix 2nd Edition поддерживала всего пять опций: -l
для вывода списка в длинном формате, -t
для сортировки по времени, а не по имени, -a
для перечисления всех файлов, -s
для показа, каков размер каждого файла и -d
для перечисления имён каталогов, а не их содержимого. Современная команда ls
в GNU поддерживает как эти исходные опции, так и более пятидесяти расширений для них.
Родословная всех современных Unix-подобных систем прослеживается вплоть до исходного Unix. Linux — одна из таких систем, использующих инструментарий GNU. Набор GNU основан на инструментах Unix. В 2024 Linux уже не указывается в исходной структуре Unix, и неслучайно: теперь Linux поддерживает такие архитектуры и инструменты, о которых и мечтать было нельзя на момент зарождения Unix. Но общий принцип работы с командной строкой по-прежнему сохранился во многом таким, каким его закладывали в Unix в 1970-е. В следующий раз, когда вам доведётся при помощи ls
вывести список файлов из каталога — вспомните, что вы пользуетесь инструментом, которому уже больше пятидесяти лет.
Автор: Albert_Wesker