|
|
|||||
В оглавление Как только речь заходит об устройстве Linux и более или менее профессиональной работе с этой ОС, в примерах немедленно возникает и начинает доминировать командная строка. Из чего несложно сделать вывод, что это главный (и стандартный) интерфейс управления системой в Linux. Тот же проницательный читатель наверняка задастся вопросом — а кто же выполняет команды, введённые в командной строке? Ответ «система» окажется неправильным: в Linux нет отдельного объекта под именем «система». Система — она на то и система, чтобы состоять из многочисленных компонентов, взаимодействующих друг с другом. Правильный ответ, как водится, оказывается более сложным. Операционная система нужна в частности для того, чтобы программы можно было писать, не думая о подробностях устройства компьютера и его деталей, начиная от процессора и жёсткого диска (скажем, на уровне «открыть файл», а не последовательности команд перемещения головки жёсткого диска). Операционная система управляет оборудованием сама, а программам предоставляет «язык» довольно высокого уровня абстракции, покрывающий все их необходимости, т. н. API1. Но для команд пользователя такой язык не годится, поскольку он всё равно слишком низкоуровневый (для решения даже самой простой задачи пользователя необходимо выполнить несколько таких операций), да и воспользоваться им можно, только написав программу (чаще всего — на языке Си). Возникает необходимость выдумать для пользователя другой — более высокоуровневый и более удобный — язык управления системой. Все команды, которые можно ввести в командной строке, сформулированы именно на этом языке. Из чего проницательному читателю несложно заключить, что обрабатывать эти команды, переводя их на язык операционной системы, должна тоже какая-нибудь специальная программа, и именно с ней ведёт диалог пользователь, работая с командной строкой. Так оно и есть: программа эта называется интерпретатор командной строки или командная оболочка («shell»). «Оболочкой» она названа как раз потому, что всё управление системой идёт как бы «изнутри» неё: пользователь общается с нею на удобном ему языке (с помощью текстовой командной строки), а она общается с другими частями системы на удобном им языке (вызывая запрограммированные функции). Конечно, командных
интерпретаторов в Linux несколько. Самый простой из них, появившийся в
ранних версиях UNIX, назывался Синтаксис командной строкиИтак, что же представляет собой этот более удобный для пользователя язык? Больше всего общение на этом языке напоминает письменный диалог с системой — поочерёдный обмен текстами. Высказывание пользователя на этом языке — это команда, каждая команда — это отдельная строка. Пока не нажат enter, строку можно редактировать, затем она передаётся оболочке. Оболочка разбирает полученную команду — переводит её на язык системных объектов и функций, после чего отправляет системе на выполнение. Результат выполнения очень многих команд также представляет собой текст, выдаваемый в качестве «ответа» пользователю. Хотя это и не обязательно — команда может выполнять свою работу совершенно молчаливо. Кроме того, если в процессе выполнения команды возникли какие-то особые обстоятельства (например, ошибка), оболочка включит в ответ пользователю диагностические сообщения. Команда и параметрыПростейшая команда состоит из одного «слова», например,
команда
А если нужно посмотреть календарь на будущий месяц? Верно, не
следует для этого изобретать отдельную команду3,
Выходит, команда СловаПри разборе командной строки shell использует понятие разделитель (delimiter). Разделитель — это символ, разделяющий слова; таким образом командная строка — это последовательность слов (которые имеют значение) и разделителей (которые значения не имеют). Для shell разделителями являются символ пробела, символ табуляции и символ перевода строки. Количество разделителей между двумя соседними словами значения не имеет. Для того, чтобы разделитель попал внутрь слова (и
получившаяся строка с разделителем передалась как один
параметр), всю нужную подстроку надо окружить одинарными или двойными
кавычками:
Ключи Для решения разных задач одни и те же
действия необходимо выполнять слегка по-разному. Например, для
синхронизации работ в разных точках земного шара лучше использовать
единое для всех время (по Гринвичу), а для организации собственного
рабочего дня — местное время (с учётом сдвига по часовому поясу и
разницы зимнего и летнего времени). И то, и другое время показывает
команда
Такого рода параметры
называются модификаторами выполнения или ключами
(options)4.
Ключ принадлежит данной конкретной команде и сам по себе смысла не
имеет, чем отличается от прочих параметров (например, имён файлов,
чисел), которые имеют собственный смысл, не зависящий ни от
какой команды. Каждая команда может распознавать некоторый набор ключей
и соответственно изменить своё поведение. В результате «один и тот же»
ключ, например, “ Для формата ключей нет
жёсткого стандарта, однако существуют договорённости, нарушать которые
в наше время уже неприлично. Во-первых, если параметр начинается на “ Во-вторых, желательно, чтобы
имя ключа было значащим — как правило, это первая буква
названия действия или свойства, обозначаемого ключом. Например, ключ “
Свойство ключа быть, с одной стороны, предельно коротким, а с другой стороны — информативным, называется аббревиативностью. Не только ключи, но и имена наиболее распространённых команд Linux обладают этим свойством. В-третьих, иногда ключ изменяет поведение команды таким
образом, что меняется и толкование параметра, следующего в командной
строке за этим ключом. Выглядит это так, будто ключ сам
получает параметр, поэтому ключи такого вида называются параметрическими.
Как
правило,
их
параметры —
имена
файлов различного применения,
числовые характеристики и прочие значения, которые нужно
передать команде.
Ключ “
Аббревиативность ключей трудно соблюсти, когда их у команды слишком
много. Некоторые буквы латинского алфавита (например, “ В-четвёртых, есть некоторые менее жёсткие, но популярные
договорённости о значении ключей. Ключ “ СинопсисИз всего вышесказанного ясно, что для каждой команды существует свой собственный небольшой язык — его составляют те ключи и обязательные и необязательные параметры, которые принимает и интерпретирует команда. Чтобы окинуть возможности команды одним взглядом, в различной документации по Linux приводится синопсис — сжатое перечисление всех возможных параметров команды. Выглядит это примерно так:
Откуда берутся командыДочитав предыдущий раздел, проницательный читатель должен был подумать примерно так: ага, ну с командами и параметрами (т. е. с грамматикой командной строки) мы немного разобрались, вооружите же нас теперь списком всех команд Linux (иначе говоря, словарём), и мы примемся за работу. Почему же нигде не напечатан такой список? Точнее, списков команд много разных и все они очевидно неполные и не во всём сходятся. Ответ на этот вопрос состоит из двух частей. Часть 1: команды и утилитыShell, командный интерпретатор, является «оболочкой» не только для пользователя, но и для команд: сам он почти никакие команды не исполняет, передаёт системе. Его задача сводится к тому, чтобы разобрать командную строку, выделить из неё команду и параметры, а затем запустить утилиту6 — программу, имя которой совпадает с именем команды. Если смотреть «изнутри»
командного интерпретатора, то работа с командной строкой происходит
примерно так: пользователь вводит строку (команду), shell считывает её,
иногда — преобразует по определённым правилам, получившуюся строку
разбивает на команду и параметры, а затем запускает утилиту, передавая
ей эти параметры. Утилита, в свою очередь, анализирует параметры,
выделяет среди них ключи, и делает что попросили, попутно выводя данные
для пользователя, после чего завершается. По завершении утилиты
возобновляется работа «отступившего на задний план» командного
интерпретатора, он снова считывает командную строку, разбирает её,
вызывает команду... Так продолжается до тех пор, пока пользователь не
скомандует оболочке завершиться самой (с помощью команды Однако часть команд
(меньшую) оболочка всё же выполняет самостоятельно, не вызывая никаких
утилит. Некоторые — самые нужные — команды встроены в
Собственных команд в командном интерпретаторе немного. В основном это — операторы языка программирования и прочие средства управления самим интерпретатором. Все команды, выполняющие содержательную работу для пользователя, представлены в Linux в виде отдельных утилит. Вот и первая часть ответа на вопрос обо всех командах Linux: их столько же, сколько есть программ (утилит), написанных для Linux. Их список — это список установленных в системе утилит, и в разных системах он будет различным. Часть 2: всему своё руководствоКаждый объект системы: все утилиты, все демоны Linux, все функции ядра и библиотек, структура большинства конфигурационных файлов, наконец, многие умозрительные, но важные понятия — должны обязательно сопровождаться документацией, описывающей их назначение и способы использования. Поэтому от пользователя системы не требуется заучивать все возможные варианты взаимодействия с ней. Достаточно понимать основные принципы её устройства и уметь находить справочную информацию. Эйнштейн говорил на этот счёт так: «Зачем запоминать то, что всегда можно посмотреть в справочнике?». Больше всего различной
полезной информации содержится в страницах руководства
(manpages). Каждая страница руководства (для
краткости — просто «руководство») посвящена какому-нибудь одному
объекту системы. Для того, чтобы посмотреть страницу руководства, нужно
дать команду «Страница
руководства» занимает, как правило, больше одной страницы экрана.
Для
того,
чтобы
читать
было
удобнее, Страница
руководства состоит из полей — стандартных
разделов, с разных сторон описывающих объект. При первом изучении
руководства стоит начать с полей
В системе может встретиться
несколько объектов разного типа, но с одинаковым названием.
Часто совпадают, например, имена системных вызовов
(функций ядра) и утилит, которые позволяют
пользоваться этими функциями из командной строки. При ссылке на
руководство по объекту системы принято непосредственно после имени
объекта ставить в круглых скобках номер раздела, в котором содержится
руководство по этому объекту: В системе руководств
Linux девять разделов, каждый из которых содержит страницы руководства
к объектам определённого типа. Все разделы содержат по одному
руководству с именем «intro», в котором в общем виде и на примерах
рассказано, что за объекты имеют отношение к данному разделу. Список
разделов с названиями можно получить командой По умолчанию Другой источник
информации о Linux и составляющих его программах — справочная
подсистема Если некоторый объект системы
не имеет документации ни в формате Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский — не родной язык для автора документации, она будет только проще. Традиция писать по-английски идёт от немалого вклада США в развитие компьютерной науки вообще и Linux в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием Linux. Дело не в том, что страницу руководства нельзя перевести, а в том, что её придётся переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации. Тогда перевод этой документации превращается в «moving target», сизифов труд. Тем не менее,
некоторые наиболее актуальные руководства всё-таки существуют в
переводе на русский язык. Наиболее свежие версии таких переводов на
русский собраны в пакете Переменные окруженияПомимо параметров, передаваемых в командной строке, в Linux есть ещё один способ модифицировать поведение программы — для этого используются переменные окружения. Чтобы объяснить принцип работы переменных окружения, потребуется небольшой экскурс в механизм взаимодействия процессов в Linux. Выполняющаяся программа называется в Linux процессом. Каждый запускаемый процесс система снабжает неким информационным пространством, которое этот процесс вправе изменять как ему заблагорассудится — это и есть окружение (по-английски environment). Правила пользования этим пространством просты: в нём можно задавать именованные хранилища данных (переменные окружения), в которые записывать какую угодно информацию (присваивать значение переменной окружения), а впоследствии эту информацию считывать (подставлять значение переменной). Процессы — это основные действующие лица в системе. Когда пользователь отдаёт команды в командной строке, то новые процессы для выполнения этих команд (внешние утилиты и т. п.) запускает другой процесс — тот самый командный интерпретатор, который общается с пользователем и принимает от него команды. Создание одного
процесса другим называется порождением процесса и происходит
в два этапа: сначала создаётся точная копия исходного, родительского
процесса (системный вызов Вернёмся к работе
командного интерпретатора: выполняя команду, он запускает нужную
утилиту в качестве дочернего процесса, дожидается окончания её работы
(при помощи ещё одного системного вызова, Одна и та же утилита
может быть использована одним и тем же способом, но в
изменённом окружении — и выдавать различные результаты.
Пользователь может явно изменить окружение для запускаемого процесса,
присвоив некоторое значение переменной окружения в командной строке перед
именем команды. Командный интерпретатор, увидев “
Переменная окружения Переменные, которые командный интерпретатор bash
определяет после запуска, не принадлежат окружению, и, стало
быть, не наследуются дочерними процессами. Чтобы переменная bash
попала в окружение, её надо проэкспортировать командой Во
время сеанса работы пользователя командный интерпретатор получает
довольно богатое окружение, к которому добавляет и собственные
настройки. Большинство заранее определённых переменных используются
либо самой командной оболочкой, либо утилитами системы, поэтому их
изменение приводит к тому, что оболочка или утилиты начинают работать
слегка иначе. Просмотреть окружение в bash можно с
помощью команды К значению любой переменной в
Весьма примечательна переменная окружения
Переменных
окружения,
влияющих
на
работу
разных утилит,
довольно много. Например, переменные семейства 3 Представьте себе язык, в котором для выражения любой мысли существует отдельное слово — он был бы невероятно неэффективным, и обязательно нашлась бы мысль, на этом языке невыразимая. В естественных языках для выражения мысли используются мощные средства комбинации и модификации слов, и, соответственно, их значений — грамматика языка. Аналогичный принцип действует и в языке командной оболочки, только здесь «грамматику» принято называть синтаксисом. 4 Многие склонны вместо слова «ключ» употреблять слово «опция» как аналог английского option, однако это не признак хорошего стиля. Наверх
|
||||||
|