Операционная система Unix — интерпретаторы, стандартные потоки ввода вывода, фильтры

В UNIX взаимодействие пользователя с операционной системой обычно осуществляется через командный интерпретатор (shell). Командный интерпретатор — это программа, которая принимает команды пользователя, анализирует их и организует их выполнение.

*Наиболее распространённые оболочки: sh, bash, ksh, csh.

Shell работает как обычный пользовательский процесс: получив внешнюю команду, он ищет одноименный исполняемый файл в папках, жестко прописанных в переменной окружения $PATH (/bin или /usr/bin), после чего обращается к ядру через интерфейс системных вызовов. Ядро создает копию процесса shell, через вызов exec() заменяет её код на инструкции найденной программы, выделяет виртуальную память, организует ввод-вывод, а сам shell в это время ждет завершения команды через системный вызов wait(), чтобы затем снова вывести курсор ожидания.

Для обмена данными между программами и пользователем в UNIX используются стандартные потоки ввода-вывода:

  • stdin (стандартный ввод, дескриптор 0);
  • stdout (стандартный вывод, дескриптор 1);
  • stderr (стандартный поток ошибок, дескриптор 2).

Потоки можно перенаправлять в файлы, устройства или другие программы. Основные операции перенаправления:

  • команда > файл — запись вывода в файл;
  • команда >> файл — добавление вывода в конец файла;
  • команда < файл — использование файла как источника ввода;
  • команда1 | команда2 — передача вывода первой программы на вход второй;
  • команда 2> файл — перенаправление потока ошибок;
  • команда > файл 2>&1 — объединение stdout и stderr.

Существует специальный файл /dev/null. Любые данные, записанные в него, безвозвратно отбрасываются. Он используется для подавления ненужного вывода и сообщений об ошибках.

Фильтры

Одним из основных принципов UNIX является построение обработки данных из небольших специализированных программ, называемых фильтрами.

Фильтр — это программа, которая получает данные через stdin, обрабатывает их и передаёт результат через stdout. Благодаря этому фильтры удобно объединять в конвейеры.

Прим.:

  • grep — поиск строк по шаблону;
  • sort — сортировка строк;
  • head/tail — вывод первых/последних строк файла;

Конвейер (pipeline) — stdout одной программы последовательно передаётся stdin другой программы. 

Прим.: cat file.txt | grep “error” | sort | uniq | wc -l