5. Что происходит когда вы запускаете на выполнение программы в командном интерпретаторе shell?

Shell в Unix интерпретирует вводимые вами команды; он назван shell (раковина, скорлупа, оболочка) потому что обертывает и скрывает ядро операционной системы. Это важная особенность Unix — shell и ядро (kernel) разные программы, общающиеся посредством системных вызовов. Это делает возможным существование множества shells, удовлетворяющих разным вкусам в интерфейсе.

Обычно, после входа в систему, shell выводит для вас приглашение ‘$’ (если вы не изменили его на что-то другое). Вместо обсуждения синтакса команд и простых вещей, которые вы видите на экране, мы заглянем за сцену и посмотрим что же происходит с точки зрения компьютера.

После загрузки системы и прежде чем вы запустите какую-либо программу, можете думать о своем компьютере как месте содержащем целый зоопарк процессов, которые все ожидают для того чтобы что-то сделать. Они все ждут событий (events). Событие это нажатие клавиши или движение мышки. Или, если ваш компьютер подключен к сети, событием может быть пакет с данными пришедших по ней.

Ядро один из этих процессов. Это особый процесс, потому что контролирует другие пользовательские процессы (user processes), и обычно это единственный процесс, имеющий непосредственный доступ к аппаратным средствам компьютера. В действительности, пользовательские процессы делают запросы к ядру когда им нужно получить ввод с клавиатуры, вывести данные на экран, прочитать или записать на диск, или сделать что-нибудь другое, кроме как перебирания битов в памяти. Эти запросы известны как системные вызовы (system calls).

Обычно весь ввод/вывод (I/O) идет через ядро, и оно таким образом может планировать операции и предотвращать конфликты между процессами. Нескольким специальным пользовательским процессам дозволено обходить ядро, обычно для прямого доступа к портам ввода/вывода (I/O ports). Наиболее яркий пример такого процесса — X-сервер (программа которая управляет запросами других программ на доступ к работе с графическим экраном на большинстве машин с Unix). Но мы пока не добрались до X-сервер, и смотрим на приглашение shell выведенное на символьный экран.

Shell это обычный пользовательский процесс, и ничего в нем особенного нет. Он ожидает ваших нажатий на клавиши, прослушивая (через ядро) порт ввода/вывода клавиатуры. Как только ядро видит их, оно отражает их на экране. Когда ядро видит нажатие клавишы ‘Enter’ (‘Ввод’) оно посылает shell строку набранного вами текста. Shell пытается интерпретировать это как команду.

Скажем вы набрали ‘ls’ и нажали Enter чтобы вызвать команду Unix, которая выводит список файлов и каталогов. Shell используя встроенные в него правила определяет, что вы хотите запустить на выполнение команду содержащуюся в файле /bin/ls. Он делает системный вызов к ядру запрашивающий запуск /bin/ls в качестве нового дочернего процесса (child process) передает ему доступ (через ядро) к экрану и клавиатуре. После этого shell отправляется спать ожидая пока ls закончит свою работу.

Когда /bin/ls закончит, он сообщит об этом ядру через системный вызов exit (выход). Тогда ядро разбудит shell и скажет ему что можно продолжать работу. Shell снова выведет приглашение и будет ждать получения очередной строки ввода.

Однако, пока выполняется ‘ls’ могут происходить и другие вещи (вывод списка файлов может быть долгим если их очень много). Вы можете переключится на другую виртуальную консоль, войти там в систему, и запустить, например, игру Quake. Или, предположим вы подключены к Интернет. Ваша машина в силе отправлять и получать почту, пока работает /bin/ls.