Есть операционная система. Она никогда не делает, чтобы пользователь мог работать - не выводит бессмысленных текстов куда-то и не считывает откуда-то. Возможно в допотопном прошлом такие задачи были, но это маргинальое положение дел, а не естественное. Пользовательские задачи не заключаются в обработке текста.

Зафиксируем свойства терминала. Первое, что видим - эмулятор терминала. Интерфейсы все разные. Все представляют собой окно (рабочую область) + интерпретатор командной строки, который обеспечивает диалог с пользователем посредством окна ("Маша общалась с Дубровским через дупло"). Окно - штука наживная, роль окна может выполнять весь монитор (например, системная консоль). Ни то, ни другое - не является терминалом в точном смысле этого слова. Терминал - дупло, за которым кончается система и начинается Маша. Давным-давно, когда компы были большие, а диски маленькие - роль терминала играло любое устройство, которое умело передавать байт. Традиционно печатные символы были буквами, а непечатные - управляющими. Пользователь интерпретирует байты, как текст. Терминалами назывались такого рода устройства (железяка из клавиатуры, алфавитно-цифрового дисплея и последовательного порта, который можно воткнуть в комп, компу сказать что на таком-то порту терминал, в результате какие-то байты воспринимались как байты)... Терминал наследует идеологию печатной машинки.

Если я хочу нарисовать красивую рамку, а потом написать красивый текст, то передо мной устройство 80х25 и курсор. Это означает, что если хочется вывести красивость - терминал должен уметь, получая специальные символы, переставлять курсор в специальное место и т.п. Т.е. отличаться от печатной машинки в лучшую сторону тем, что если он уж не помнит, что на нём нарисовано, то хотя бы позволяет нарисовать что-нибудь.

ESC-последовательности. Обычные печатные символы выводятся as is. Управляющие символы вообще не доходят до пользователя, они влияют на ввод. ESC-последовательности - на вывод.

Телетайпность терминала не мешает ведению диалога. Вы вводите символы, редактируете их, потом нажимаете перевод строки и оно передается программе. Это отличительная особенность от просто передачи байт. Железных терминалов было разных тысячи, все были ужасно разные и с разными esc-последовательностями. Их выпускали те же, кто выпускал печатные машинки.

Терминал - это операционная система. никто, кроме операционной системы не разделит печатные символы от управляющих. обратите внимание, как на основании замечательного свойства терминала строится диалог.

диалог между пользователем и интерпретатором командной строки происходит по строкам. ПОльзователь вводит, нажимает enter, строка интерпретируется и выводится диагностика, получается диалог. Построчно организованный диалог не мешает свойствам телетайпности. В современных ИКС редактирование прогрессивнее.

Свойства: * редактирование * управляющий поток объединяется с потоком данных (вы хотите получить от терминала список файла в текущем каталоге. Вы вводите ls, а вам выводят список файлов. Потом вы говорите ls имя_каталога - вам выводят список, вы вводите ls и фигню - вам показывают ошибку). Ваша задача интерпретировать текст как данные или часть потока управления. В этом есть юзабилити, потому что не надо никуда переключаться для наблюдения разных потоков, всё в тексте. С другой стороны диалог текстовый и это разумный компромисс между формализацией и гибкостью. Мы можем рассмотреть интерфейс из 2 рычагов и 1 кнопки, но тут мало рычагов управления. Наща задача - управлять целой системой. С другой стороны - безумное количество непонятных пиктограмм в интерфейсе сильно ухудшает формализацию. Методички по настройке гуёв ужасны :) Роботы ниасилят, а командную строку осилят. * формализация и гибкость.

Описывая интерпретатор командной строки в таких терминах описывается не только шелл. Питон тоже годен, например. Или не питон. Какой-нибудь mysql. И такого в линукс-системах очень много. Из всех интерпретаторов командных строки shell является первым попавшимся, просто потому что это программа для управления собственно системой.

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

Рассмотрим пока внешность ИКС.

Как выглядит командная строка, которая интерпретируется? Достаточно просто. Есть понятие разделителя (пробел, табуляция) и перевод строки (если его не додуматься ввести как управляющий символ). Строка разделяется на последовательность не-разделителей и разделителей. В общем виде командная строка выглядит так - [подготовка окружения] (актуально, когда вы ужасно не хотите читать ман на русском языке, например - LC_ALL=POSIX) команда (например man) [параметры] (например strtok).

Как выгллядят команды? команда: *встроенные (команды самого шелла) *программы (утилиты) Когда вы вводите просто слово - шелл определяет, является ли это его встроенная команда или нет. Все программы лежат в стандартных местах, коих немного. Потому шеллу хорошо живется. Параметры:

откуда-нибудь. Очень часто хочется получить файл.что-нибудь. И вы пишите wget -O file.html. file.html не существует в файловой системе, это параметр ключа -O. Либо wget --output=file.html. Это соглашение. На экзамене было бы неплохо ответить, где оно не соблюдается ;) И это же домашнее задание

Примеры:

ls -l

ls -l -a

ls -la

Если напишете вместо параметра * - подставятся все файлы в каталоге и постараются выполнить команду с файлами. Это идёт в разрез с командной строкой в виндовс, где каждое приложение само интерпретирует шаблоны. Это иногда мешает. Например вы выполняете команду rm *. Если вы находитесь в соответствующем состоянии, вы даже случайно можете набрать эти символы. Эта команда превратится в список файлов в каталоге и будет означать удаление всех файлов, кроме скрытых. Без дополнительных приседаний никто не вспомнит, что вы такую команду выполняли. Пользователей, которые пишут звездочку случайно - нужно разлогинивать, чтобы неповадно было :)

Например есть файлы -f и -r. И очень важный каталог ovc. Вы пишете rm *. Получаете rm -f -r ovc. Домашнее задание номер два - как удалить файл с названием -r. Это очень легко, надо прочесть документацию.

Чтобы закончить с командной строкой, то ещё 2 вещи:

как в интерпретаторе командной строки.

Команды, которые предназначены для получения документации. man - предназначена для просмотра страниц руководства. man <объект>. Ведет своё начало от классических ранних систем. Состоит из последовательного запуска 2 команд - форматирование (groff) и less. Бывает ещё и more. А less - редактор без возможности редактирования.

Свойства мана:

гиперссылками, картинками, роликами и т.п. в сторонке По этим причинам в классических unix-системах всё сопровождалось мануалами и это был райский ад. По крайней мере было понятно, что можно сказать man что-нибудь. Есть ещё команды apropos <ключевое слово> и whatis <объект>.

Есть ещё info <объект>. Если есть pinfo - лучше его, хотя кому что. Формат info гипертекстовый, утилита терминальная, во многих случаях мануала не будет или 10 строк, а дальше смотрите info.

Это условный инвариант, такие команды существуют наверняка. Может не стоять сама документация, но если уж есть man, то он одинаковый. А вот графические инструменты для просмотра man и info сильно зависят от окружения. Например в kde и т.п. можно смотреть маны из центра справки.

Домашнее задание выполняется изучением вот этого.

LecturesCMC/GnuLinuxSoftware2011/02 (последним исправлял пользователь Allena 2011-12-04 01:51:47)