Глава 2. коммандная строка unix
Операционная система предоставляет пользователю специальный интерфейс –
командную строку, через которую пользователи получают
персональную рабочую среду. Несмотря на то, что в современных UNIX-системах широко
используются графические пользовательские интерфейсы, командная строка остаётся
основным рабочим инструментом администратора системы.
Презентация 3-01: терминал и командная строка
В операционной системе UNIX основными средствами взаимодействия пользователя с
системой являются клавиатура и экран монитора, работающий в текстовом режиме.
Вводимый пользователем текст немедленно отображается на мониторе соответствующими
знаками, однако может и не отображаться (например, в случае ввода пароля). Для
управления вводом используются некоторые нетекстовые клавиши на клавиатуре:
Backspace (он же «Забой») – для удаления
последнего введенного символа или Enter – для передачи
команды системе. Нажатие на эти клавиши не приводит к отображению символа, вместо
этого вводимый текст обрабатывается системой тем или иным способом –
эти клавиши и их комбинации объединяют понятием
управляющие символы.
Текстовый принцип работы с машиной позволяет отвлечься от конкретных частей
компьютера, вроде системной клавиатуры и видеокарты с монитором, рассматривая
единое оконечное устройство, посредством которого пользователь вводит текст и
передает его системе, а система выводит необходимые пользователю данные и
сообщения. Такое устройство называется терминалом. В общем случае терминал – это
точка входа пользователя в систему, обладающая способностью передавать текстовую
информацию. Терминалом может быть отдельное внешнее устройство, подключаемое к
компьютеру через порт последовательной передачи данных
(«COM-порт»). В роли терминала может работать (с некоторой поддержкой
со стороны системы) и программа (например, xterm
или ssh).
Свойство терминала передавать только символьную информацию приводит к тому, что
некоторые из передаваемых символов должны восприниматься не как текстовые, а как
управляющие (например, символы, возвращаемые клавишами Backspace и Enter). На
самом деле управляющих символов больше: часть из них предназначена для экстренной
передачи команд системе, часть – для редактирования вводимого
текста. Многие из этих символов не имеют специальной клавиши на клавиатуре,
поэтому их необходимо извлекать с помощью клавиатурного
модификатора Ctrl. Проблема в том, что на клавиатуре может быть
так много разных нетекстовых клавиш, что на них не хватает ограниченного
количества разных управляющих символов. Поэтому большинство нетекстовых клавиш
возвращают так называемую управляющую последовательность, которая
начинается управляющим символом, за которым следует строго определенное число
обычных символов.
Одной из полезных особенностей терминала является позможность
его «прокрутки» с помощью
клавиш Shift–PgUp
и Shift–PgDn. Это может быть
полезно, если вывод программы занимает больший объём, чем размер экрана.
Основная среда взаимодействия с
UNIX – командная строка. Суть её в том, что каждая строка, передаваемая пользователем
системе, – это команда, которую та должна выполнить. Пока не нажата
клавиша
Enter, строку можно редактировать, затем она отсылается системе.
Команды интерпретируются и выполняются специальной программой –
командной оболочкой (или «shell», по-английски). Через командную
оболочку производится управление пользовательскими процессами – для
этого используются средства межпроцессного обмена, описанные ранее
(см. «Межпроцессное взаимодействие»).
Командная оболочка непосредственно связана с терминалом, через который
осуществляется передача управляющих последовательностей и текста. На рисунке
Рисунок 2.1, «Интерфейс командной строки» представлена общая схема взаимодействия пользователя
с системой при использовании командной строки.
Презентация 3-02: одновременный доступ к системе
То, что UNIX – многопользовательская и многозадачная система,
проявляется не только в разграничении прав доступа (см. раздел
Глава 3, Безопасность операционной системы UNIX), но и в организации рабочего места. Каждый
компьютер, на котором работает UNIX, предоставляет возможность зарегистрироваться
и получить доступ к системе нескольким пользователям одновременно. Даже если в
распоряжении всех пользователей есть только один монитор и одна системная
клавиатура, эта возможность небесполезна: одновременная регистрация в системе
нескольких пользователей позволяет работать по очереди без необходимости каждый
раз завершать все начатые задачи (закрывать все окна, прерывать исполнение всех
программ) и затем возобновлять их. Более того, ничто не препятствует
зарегистрироваться в системе несколько раз под одним и тем же входным
именем. Таким образом, можно получить доступ к одним и тем же ресурсам (своим
файлам) и организовать параллельную работу над несколькими задачами.
Характерный для современных версий UNIX способ организации параллельной работы
пользователей – виртуальные консоли. Виртуальные консоли (virtual
console) – это несколько параллельно выполняемых операционной системой
программ, предоставляющих пользователю возможность зарегистрироваться в системе в
текстовом режиме и получить доступ к командной строке
(см. Рисунок 2.2, «Виртуальные и графические консоли»).
В операционной системе Linux переключение между виртуальными консолями в текстовом
режиме производится с помощью комбинации клавиш
Alt–F1,
Alt–F2 и т.п.. При этом
каждая виртуальная консоль обозначается специальным
именем: «tty1», «tty2» и т.д.. По умолчанию в Linux
доступно не менее шести виртуальных консолей, переключаться между которыми можно
при помощи сочетания клавиши Alt с одной из функциональных клавиш
(F1–F6). С каждым сочетанием связана
соответствующая по номеру виртуальная консоль. Виртуальные консоли обозначаются
«ttyN», где «N» – номер виртуальной консоли.
На самом деле, каждая из таких конолей связано с
собственным терминалом, который характеризуется файлом
устройства с соответствующим именем (например, /dev/tty1
).
Современные версии UNIX предоставляют пользователям графические пользовательские
интерфейсы (подробнее графическая подсистема UNIX рассматривается в разделе
Глава 7, Графическая подсистема UNIX), которые также дают возможность работы в
командной строке. Эта возможность достигается с помощью
графических терминалов – специальных программ, которые эмулируют
текстовый терминал в графическом окне.
Также существует возможность запуска нескольких графических подсистем, тогда
переключение между ними будет осуществляться аналогично переключению между
виртуальными консолями – комбинацией клавиш
Ctrl–Alt–F1.
Каждое устройство терминала имеет свои возможности по вводу и
выводу информации. Примерати таких возможностей являются: число цветов
отображения, способность перемещать курсор и изменять размер экрана, набор
управляющих символов и т.п.. Терминалы разделяют по типам: набору возможностей, регламентированных в
специальном конфигурационном файле. Примерами типов являются: tty (телетайп) или
xterm (графический терминал). Тип терминала явно указан в имени устройства
терминала (например, /dev/tty1
). Все настройки типов
терминалов находятся в директории /etc/termcap
.
Презентация 3-03: формат командной строки
Каждая команда UNIX состоит из следующих частей:
- Имя команды
Идентификатор команды, совпадающий с именем программы, которая
запускается для исполнения команды. Некоторые команды (такие
как echo) являются встроенными для данной командной
оболочки и для их выполнения вызывается не программа, а внутренняя
функция оболочки.- Параметры или ключи или флаги или опции
Команда может иметь один или несколько параметров,
разделённых пробелом. Параметры могут быть однобуквенными
(как-l
) или полнословными
(например,--help
).
Однобуквенные параметры могут группироваться, например запуск команды
ls -al эквивалентен запуску ls -a -l. Некоторые параметры состоят из имени и аргумента, например
в коменде grep -f access.log -n test имя
файлаaccess.log
– часть параметра
-f
.- Аргументы
Некоторые команды могут иметь аргументы. Аргументом может являться текстовая строка, соответвтующая имени файла или другого объекта. Аргументы также разделяются символом пробела, чтобы передать в качестве аргумента строку символов с пробелами, можно воспользоваться символами кавычек:
user@desktop ~ $ echo "Hello, world." Hello, world.
- Перенаправления
Стандартный ввод и вывод каждой команды
(см. «Межпроцессное взаимодействие») может быть
перенаправлен в файл. По умолчанию ввод и вывод команды связываются с
пользовательским терминалом. Для указания источника ввода или назначения
вывода (для обычной информации и для ошибок отдельно) используются
специальные символы (<, > и >>).
Как правило, порядок данных частей команды должен быть именно таким, однако некоторые из них (кроме имени команды) могут отсутствовать.
Презентация 3-06: способы объединения команд
Существует возможность объединять несколько команд в одной командной строке. Это
можно делать несколькими способами:
- Последовательное выполнение
Команды выполняются одна за другой, не зависимо от результата их
исполнения. В качестве разделителя выступает символ точки с запятой
(«;»).В качестве примера можно рассмотреть составную команду
du -sh; date, которая выводит на экран содержимое
домашней директории, а затем текущие дату и время.- Условное выполнение (И)
Проверяется код завершения первой программы, если он
равен0
, производится выполнение второй программы, и
так далее. Таким образом, последняя команда выполнится только при
успешном завершении всех предыдущих. В качестве разделителя выступают
два амперсанда («&&»).В качестве примера можно рассмотреть составную команду
test -r /tmp/txt && cp /tmp/txt ., которая
проверяет возможность чтения файла/tmp/txt
и в
случае успеха, копирует этот файл в локальную директорию.- Условное выполнение (ИЛИ)
Проверяется код завершения первой программы, если он
не равен0
, производится
выполнение второй программы, и так далее. Последняя команда будет
запущена только если ни одна из предыдущих не закончилась успешно. В
качестве разделителя выступают две вертикальный черты
(«||»).В качестве примера можно рассмотреть составную команду
test -d /tmp/dir || mkdir /tmp/dir, которая
проверяет существование директории/tmp/dir
и если
её нет, создаёт её.- Конвейер
При выполнении программ связываются их стандартные выходы и входы, так что текстовые данные передаются через них последовательно, как по конвейеру. Этот механизм является одной из самых фундаментальных особенностей UNIX и широко используется при работе в командной стоке.
Все программы могут быть запущены одновременно, так чтобы обеспечить интерактивность вывода при прохождении данных через цепочку программ. Если одна из программ в цепочке конвейера завершится (например, в случае ошибки), остальным будет отправлен специальный сигнал (SIGPIPE).
В качестве разделителя используется символ вертикальный черты
(«|»).Рассмотрим пример команды cat file.txt | uniq | sort,
которая читает содержимое файлаfile.txt
, удаляет
из него повторяющиеся строки и сортирует оставшиеся строки по
алфавиту. Результат выводится на экран.
Современные командные оболочки позволяют строить более гибкие условные выражения (с импользованием скобок и знака отрицания) из выполняющихся команд.
Презентация 3-07: служебные символы
Из предыдущих разделов видно, что в командной строке присутствует множество
служебных символов, каждый из которых имеет своё значение. Все эти символы
следует с осторожностью использовать в именах файлов.
Рассмотрим основные группы служебных символов командной оболочки:
- Символы-разделители
Используются для отлеления частей команды или нескольких команд. К ним
относятся: пробел, табуляция. По умолчанию команды разделяются символом
перевода строки. При использовании символа пробела в именах файлов
необходимо заключать параметр в кавычки или предварять пробел символом
обратной косой («»).- Символы пути
Используются для разделения элементов пути. Сюда можно отнести символ
корня («/») и символ домашней директории
(«~») – в командной строке он автоматически
заменяется на полный путь к домашней директории. При этих символов в
именах файлов необходимо предварять их символом обратной косой
(«»).- Символы команд
Применяются в аргументах команд, для отделения нескольких команд, для
запуска процессов на заднем фоне и т.п. К таким символам можно отнести:
«*», «&», «<»,
«>», «;», «(»,
«)», «|», «“». При этих
символов в именах файлов необходимо предварять их символом обратной
косой («»).- Символ параметров команды
Символ «–» используются для задания параметров
команд. Проблемы могут возникнуть, если имя файла начинается с этого
символа – в этом случае командная оболочка может принять
такой аргумент за набор параметров. Стандартным выходом из этой ситуации
является явное указание окончания списка параметров с «—»,
например:user@desktop ~ $ ls -l -- -test-file -rw-r--r-- 1 user users 90 Сен 19 00:20 -test-file
- Символы управления переменными
Используются для задания («=») и подстановки
(«$») значений переменных среды. При этих символов в именах
файлов необходимо предварять их символом обратной косой
(«»).- ESC-символы
Специальные ASCII-символы, вроде возврата каретки или табуляции. Их
синтаксис эквивалентен используемому в языке C – с
применением символа обратной косой («»).
Презентация 3-08: программное окружение
Каждый запускаемый процесс система снабжает неким информационным пространством, которое этот процесс
вправе изменять как ему заблагорассудится. Правила пользования этим пространством
просты: в нем можно задавать именованные хранилища данных
(переменные окружения), в которые записывать какую угодно информацию (присваивать
значение переменной окружения), а впоследствии эту информацию считывать
(подставлять значение переменной).
В UNIX дочерний процесс – точная копия родительского, поэтому его окружение – также точная копия родительского. Если про дочерний процесс известно, что он использует значения некоторых переменных из числа передаваемых ему с окружением, родительский может заранее указать, каким из копируемых в окружении переменных нужно изменить значение. При этом, с одной стороны, никто (кроме системы, конечно) не сможет вмешаться в процесс передачи данных, а с другой стороны, одна и та же утилита может быть использована одним и тем же способом, но в измененном окружении – и выдавать различные результаты:
user@desktop ~ $ date Птн Ноя 5 16:20:16 MSK 2004 user@desktop ~ $ LC_TIME=C date Fri Nov 5 16:20:23 MSK 2004
В последнем примере пользователь присвоил некоторое значение переменной окружения
в командной строке перед именем команды. Командный интерпретатор,
увидев «=» внутри первого слова командной строки, приходит к выводу,
что это – операция присваивания, а не имя команды, и запоминает, как
надо изменить окружение команды, которая последует далее. Переменная окружения
LC_TIME
предписывает использовать определенный язык при выводе даты
и времени, а значение "C"
соответствует стандартному
системному языку (чаще всего – английскому).
Для получения значения переменной окружения необходимо воспользоваться
символом «$»:
user@desktop ~ $ echo $PWD /home/user
При старте командной оболочки, инициализируется множество системных переменных,
которые можно посмотреть с помощью команды env. Некоторые из
них представляют особый интерес для пользователя системы:
DISPLAY
Переменная используется графической подсистемой X11 и указывает на адрес
X-сервера и номер используемого экрана (подробнее об этом будет сказано
в разделе Глава 7, Графическая подсистема UNIX).EDITOR
Если какая-то утилита требует редактирования файла, то вместо
написания и использования встроенного редактора, этот файл можно
передать на редактирование программе, путь к которой хранится в
переменнойEDITOR
.HOME
Переменная сожержит имя домашней директории текущего пользователя.
PATH
Переменная окружения содержит список директорий, разделённый
символом «:». Этот список просматривается при каждом
запуске команды – в нём производится поиск исполнемых файлов
с соответвтующем команде именем. Примером значения переменной окружения
может быть «/bin:/usr/bin:/usr/local/bin».Как правило, значение этой переменной различается для простого пользователя и администратора – для того, чтобы разделить их рабочий инструментарий.
SHELL
Имя текущей программы оболочки.
TERM
Тип терминала, используемого в настоящий момент. Эта переменная анализируется программами для того, чтобы варьировать свой интерфейс в зависимости от возможностей терминала.
USER
Имя текущего пользователя.
_
(одиночный символ подчёркивания)В точности последняя команда, выполненная в командной оболочке.
Презентация 3-09: возможности командной оболочки
Современные командные оболочки, например bash
предоставляют пользователю ряд удобных особеностей пользовательского интерфейса,
облегчающих работу с командной строкой.
Двумя другими клавишами со стрелками – вверх и вниз –
задействуется весьма мощный
механизм bash – работа с
историей команд. Все команды, набранные пользователем, командная оболочка
запоминает и позволяет обращаться к ним впоследствии. По стрелке вверх, список
поданных команд «прокручивается» от последней к первой, а по
стрелке вниз – обратно. Соответствующая команда отображается в
командной строке как только что набранная, её можно отредактировать и подать
оболочке (подгонять курсор к концу строки при этом необязательно).
Чтобы история команд могла сохраняться между сеансами
работы пользователя, bash записывает ее в файл
.bash_history
, находящийся в домашнем каталоге
пользователя. Делается это в момент завершения оболочки: накопленная за время
работы история дописывается в конец этого файла. При следующем запуске командной
оболочки считывает .bash_history
целиком. История хранится
не вечно, количество запоминаемых команд в .bash_history
ограничено (обычно сохраняется 500 команд, но это можно и перенастроить).
Автодополнение очень удобно, когда цель пользователя – задать один
конкретный файл в командной строке. Если же нужно работать сразу с несколькими
файлами – например, для перемещения их в другой каталог с помощью mv,
достраивание не помогает. Необходим способ задать одно «общее» имя
для группы файлов, с которыми будет работать команда. В подавляющем большинстве
случаев это можно сделать при помощи шаблона.
Шаблон в командном интерпретаторе используется примерно в тех же целях, что и
регулярное выражение, которое будет описано в разделе
«Команды, использующие регулярные выражения»: для поиска строк определенной
структуры среди множества разнообразных строк. В отличие от регулярного
выражения, шаблон всегда примеряется к строке целиком, кроме того, он устроен
значительно проще (а значит, и беднее).
Символы в шаблоне разделяются на обычные и специальные. Обычные символы соответствуют таким же символам в строке, а специальные – обрабатываются особым образом:
Шаблону, состоящему только из обычных символов, соответствует единственная
строка, состоящая из тех же символов в том же порядке. Например, шаблону
«abc» соответствует строкаabc
, но
неaBc
илиABC
, потому что большие и
маленькие буквы различаются.Шаблону, состоящему из единственного спецсимвола «*»,
соответствует любая строка любой длины (в том числе и пустая).Шаблону, состоящему из единственного спецсимвола «?»,
соответствует любая строка длиной в один символ,
например,a
,
или@
, но неab
или8888
.Шаблону, состоящему из любых символов, заключенных в квадратные
скобки «[» и «]» соответствует строка длиной в
один символ, причем этот символ должен встречаться среди заключенных в
скобки. Например, шаблону «[bar]» соответствуют только строки
a
,b
иr
, но не
c
,B
,bar
или
ab
. Символы внутри скобок можно не перечислять
полностью, а задавать диапазон, в начале которого стоит символ с
наименьшим ASCII-кодом, затем следует «–», а
затем – символ с наибольшим ASCII-кодом. Например, шаблону
«[0-9a-fA-F]» соответствует одна шестнадцатеричная цифра
(скажем,5
,e
илиC
). Если после «[» в шаблоне
следует «!», то ему соответствует строка из одного символа,
не перечисленного между скобками.Шаблону, состоящему из нескольких частей, соответствует строка, которую
можно разбить на столько же подстрок (возможно, пустых), причем первая
подстрока будет отвечать первой части шаблона, вторая – второй
и т. д. Например, шаблону «a*b?c» будут соответствовать
строкиab@c
(«*» соответствует пустая
подстрока),a b=c
иaaabbc
, но не
будут соответствоватьabc
(«?»
соответствует подстрокаc
, а для «c»
соответствия не находится),@ab@c
(нет соответствия для
«a») илиaaabbbc
(из
трехb
первое соответствует «b»,
второе – «?», а вот третье приходится
на «c»).
Шаблоны используются в нескольких конструкциях shell. Главное место их
применения – командная строка. Если оболочка «видит» в
командной строке шаблон, она немедленно заменяет его списком файлов, имена
которых ему соответствуют. Команда, которая затем вызывается, получает в
качестве параметров список файлов уже без всяких шаблонов, как если бы этот
список пользователь ввел вручную. Шаблоны используются в нескольких конструкциях
shell. Главное место их применения – командная строка. Если оболочка
«видит» в командной строке шаблон, она немедленно заменяет его
списком файлов, имена которых ему соответствуют. Команда, которая затем
вызывается, получает в качестве параметров список файлов уже без всяких
шаблонов, как если бы этот список пользователь ввел вручную.
Большая часть того, что нужно начинающему пользователю UNIX, делается с помощью
одной правильной команды, или вызовом нескольких команд в конвейере. От
пользователя только требуется оформить решение задачи в виде сценария на
shell. На самом же деле уже самый первый из командных
интерпретаторов, sh, был настоящим высокоуровневым
языком программирования – если, конечно, считать все утилиты системы
его операторами. При таком подходе от sh требуется
совсем немного: возможность вызывать утилиты, возможность свободно
манипулировать результатом их работы и несколько алгоритмических конструкций
(условия и циклы).
Программирование на shell, а также других, более мощных интерпретируемых языках в UNIX, остается за рамками этого курса.
Презентация 3-10: справочная подсистема
Работать с UNIX, не заглядывая в документацию, практически невозможно. Это возможно, потому что документированы практически все области операционной системы. Всем пользователям настоятельно рекомендуется, приступая к работе, а тем более – к изучению UNIX, пользоваться всеми доступными руководствами. Исторически первым и основным средством документации во всех версиях являются страницы руководства (manual pages), которые будут подробно рассмотрены далее.
Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский – не родной язык для автора документации, она будет только проще. Традиция писать по-английски идет от немалого вклада США в развитие компьютерной науки вообще и UNIX в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием UNIX. Дело не в том, что страницу руководства нельзя перевести, а в том, что ее придется переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации.
Документация в UNIX играет важнейшую роль. Решение любой задачи должно начинаться
с изучения руководств. Не стоит жалеть на это времени. Даже если рядом есть
опытный пользователь UNIX, который, возможно, знает ответ, не стоит беспокоить его
сразу же. Возможно, даже зная, что нужно сделать, он не помнит как
именно – и поэтому (а также потому, что он – опытный
пользователь) начнет с изучения руководства. Это – закон, у которого
даже собственное название: RTFM, что означает «Read That Fine Manual».
Современные свободные UNIX-системы обладают большим сообществом пользователей и
разработчиков, объединённых через Интернет. В этих сообществах является нормальной
практикой взаимопомощь и ответы на вопросы по системе. Однако, здесь необходимо
следовать описанному выше принципу RTFM.
Презентация 3-11: страницы руководств (man)
Больше всего полезной информации содержится в страницах руководства, для краткости мы
будем называть их просто «руководство». Каждая страница посвящена
какому-нибудь одному объекту системы. Для того чтобы посмотреть страницу
руководства, нужно дать команду системе man объект:
user@desktop ~ $ man cal CAL(1) BSD General Commands Manual CAL(1) NAME cal - displays a calendar SYNOPSIS cal [-smjy13] [[month] year] DESCRIPTION Cal displays a simple calendar. If arguments are not specified, the current month is displayed. The options are as follows: ...
Страница руководства занимает, как правило, больше одной страницы экрана. Для
того чтобы читать было удобнее, man запускает программу постраничного просмотра
текстов – less. Управлять
программой less просто: страницы перелистываются пробелом, а
когда читать надоест, надо нажать
q (Quit). Перелистывать страницы можно и клавишами
Page Up/Page Down, для сдвига на одну строку
вперед можно применять Enter или стрелку вниз, а на одну строку
назад – стрелку вверх. Переход на начало и конец текста выполняется
по командам g и G соответственно (Go). Полный
список того, что можно делать с текстом в less, выводится по
команде h (help). Для поиска и подстветки интересующего понятия
можно воспользоваться командой /, после которой необходимо
ввести интересующий Вас термин – по нажатию
клавиши Enter, курсор перейдёт к первому упоминанию термина,
который будет выделен серым цветом. Последующие нажатия /
и Enter приведут к продолжению поиска слова по документу.
Страница руководства состоит из полей – стандартных разделов, с
разных сторон описывающих заинтересовавший объект – например, команду
cal. В поле NAME содержится краткое описание объекта (такое,
чтобы его назначение было понятно с первого взгляда). В поле SYNOPSIS дается
формализованное описание способов использования объекта (в данном
случае – того, как и с какими параметрами запускать
команду cal). Как правило, в квадратные скобки в этом поле
заключены необязательные параметры команды, которые можно ей передать, а можно и
опустить. Например, строка «[[month] year]» означает, что в этом
месте командной строки параметров у команды может не быть вообще, может быть
указан год или пара – месяц и год. Наконец, текст в поле
DESCRIPTION – это развернутое описание объекта, достаточное для того,
чтобы им воспользоваться.
Одно из самых важных полей руководства находится в конце текста. Если в процессе чтения NAME или DESCRIPTION пользователь понимает, что не нашел в руководстве того, что искал, он может захотеть посмотреть, а есть ли другие руководства или иные источники информации по той же теме. Список таких источников содержится в поле SEE ALSO:
user@desktop ~ $ man man ... SEE ALSO apropos(1), whatis(1), less(1), groff(1), man.conf(5).
Справочные руководства делятся на разделы – в зависимости от типа
описываемых объектов. Если один и тот же термин описывается в нескольких
разделах, необходимо явно указать, какой из них использовать,
например, man 3 printf для 3-го раздела руководств.
Всего существует 8 разделов руководств:
В примере выше в поле SEE ALSO обнаружились ссылки на руководства
по less, groff (программе форматирования
страницы руководства), структуре конфигурационного файла для man, а также по
двум сопутствующим командам с такими говорящими
названиями «apropos» и «whatis». Как и
команда apropos, whatis ищет подстроку в
некоторой базе данных, состоящей из полей NAME всех страниц помощи в
системе. Различие между ними в том, что whatis –
только среди имен объектов (в левых частях полей NAME), а apropos –
по всей базе. В результате у whatis получается список кратких
описаний объектов с именами, включающими искомое слово, а
у apropos – список, в котором это слово
упоминается. Для того, чтобы это узнать, все равно пришлось один раз прочесть
документацию.
Описания объектов, выводимые whatis
или apropos, отличаются числом в скобках – номером
раздела:
user@desktop ~ $ whatis passwd passwd (1) - update a user's authentication tokens(s) passwd (5) - password file passwd (8) - manual page for passwd wrapper version 1.0.5
Другой источник информации о UNIX (а точнее, в UNIX-подобных системах,
базирующихся на программном обеспечении от GNU) и составляющих ее
программах – справочная подсистема info. Страница
руководства, несмотря на обилие ссылок различного типа,
остается «линейным» текстом, структурированным только
логически. Документ info структурирован прежде всего
топологически – это настоящий гипертекст, в котором множество
небольших страниц объединены в дерево. В каждом разделе документа info всегда
есть оглавление, из которого можно перейти сразу к нужному подразделу, откуда
всегда можно вернуться обратно. Кроме того, info-документ можно читать и как
непрерывный текст, поэтому в каждом подразделе есть ссылки на предыдущий и
последующий подразделы.
Программа info использует весь экран: на большей его
части она показывает текст документа, а первая и две последних строки ориентации
в его структуре.
Одна или несколько страниц, которые можно перелистывать
клавишей Пробел или Page Up/Page Down – это узел (node). Узел содержит обычный текст и меню
(menu) – список ссылок на другие узлы, лежащие в дереве на более
низком уровне. Ссылки внутри документа имеют вид «* имя_узла::» и
перемещать по ним курсор можно клавишей Tab, а переходить к
просмотру выбранного узла –
клавишей Enter. Вернуться к предыдущему просмотренному узлу
можно клавишей l (oт «Last»). И, главное, выйти из
программы info можно, нажав q («Quit»). Более
подробную справку об управлении программой info можно в любой момент получить у
самой info, нажав ?.
Некоторые объекты системы не имеют документации ни в формате man, ни в формате
info. В этом случае можно надеяться, что при них есть сопроводительная
документация, не имеющая, увы, ни стандартного формата, ни тем более ссылок на
руководства по другим объектам системы. Такая документация (равно как и примеры
использования объекта), обычно помещается в
каталог /usr/share/doc/имя_объекта
. Как правило, имя объекта здесь – это имя программы и её текущая версия.
Существует ещё одна довольно распространённая ситуация, в которой обширная
документация по продукту, расположенная в
директории /usr/share/doc/
выходит далеко за рамки man или
info – если продукт достаточно сложен и имеет собственную
структурированную и очень объёмную документацию. Примерами могут служить
веб-сервер Apache или почтовый
сервер Postfix.
Презентация 3-12: резюме
Командная строка UNIX является основным средством работы администратора системы. Это происходит еще и потому, что в настоящее время широко распространены средства удалённой работы с системой через сетевые терминалы.
Интерфейс командной строки состоит из специального устройства терминала, который инкапсулирует особенности физических устройств ввода и вывода информации, и командной оболочки – специального процесса, который отвечает за интерактивную работу пользователя, исполняет команды и т.п..
Командная строка имеет строго определённый формат и состоит из приглашения и команды. Команда может иметь параметры и аргументы. Каждая команда возвращает вспециальный код завершения. Несколько команд могут быть объединены в одну.
Каждый процесс имеет свое программное окружнение, которое достаётся ему в наследство от родительского процесса. Окружение состоит из переменных, среди которых выделяют ряд стандартных.
Современные командные оболочки (в частности, bash)
имеют ряд дополнительных удобных возможностей интерфейса пользователя, например,
псевдонимы, автодополнение, шаблоны имен и встроенные средства программирования.
В UNIX существует огромное количество документации, основная часто которой
сосредоточена в страницах руководств (man). Также выделяют расширенные
руководства (info) и документацию, поставляемую с программой (которую можно найти
в директории /usr/share/doc
).
Ключевые термины:управляющие символы, терминал, управляющая последовательность, командная
строка, командная оболочка, виртуальная консоль, графический терминал, тип терминала, приглашение, имя команды, встроенная команда, параметры команды, аргументы команды, перенаправление ввода-вывода, код завершения, конвейер, служебные символы, окружение, переменная окружения, история команд, псевдоним, шаблон, страница руководства
Операторы find
Даже со всеми тестами, которые предоставляет find, нам всё ещё может понадобиться лучший способ описать логические взаимоотношения между тестами. Например, что если нам нужно определить, имеют ли все файлы и поддиректории в директории безопасные разрешения (права доступа)?
Нам бы хотелось найти все файлы с разрешениями отличными от 0600 и директории с разрешениями отличными от 0700. К счастью, find предоставляет способ комбинировать тесты используя логические операторы для создания более сложных логических взаимоотношений. Для выражения вышеупомянутого теста мы можем сделать так:
find ~ ( -type f -not -perm 0600 ) -or ( -type d -not -perm 0700 )
Команда запуска может показаться странной. На самом деле операторы не такие уж и сложные после того, как вы их узнаете. Вот их список:
Оператор | Описание |
---|---|
-and | Соответствие, если тесты с обоих сторон оператора являются истинной. Может быть сокращён до -a. Обратите внимание, что когда оператор отсутствует, по умолчанию применяется -and. |
-or | Соответствие, если тест с какой-либо стороны оператора является истинной. Может быть сокращён до -o. |
-not | Соответствие, если тест, следующий за оператором, является ложью. Может быть кратко записан восклицательным знаком (!). |
( ) | Группирует вместе тесты и операторы для формирования больших выражений. Это используется для управления приоритетом логических вычислений. По умолчанию find вычисляет слева направо. Часто необходимо переписать стандартный порядок вычисления для получения желаемого результата. Даже если это ненужно, иногда полезно включать символы группировки для улучшения читаемости команд. Обратите внимание, что поскольку символы круглых скобок имеют специальное значение для оболочки, то при использовании в командной строке, чтобы они могли быть переданы в find как аргумент, они должны быть заключен в кавычки. Обычно для их экранизации используется символ обратного слеша. |
Теперь, освоим этот список операторов, давайте проанализируем нашу команду find. При просмотре с самого верхнего уровня, мы видим, что наши тесты организованы в две группы, разделённые оператором -or:
( выражение 1 ) -or ( выражение 2 )
Это имеет смысл, поскольку мы ищем файлы с определённым набором разрешений и директории с другим набором. Если мы ищем файлы и директории, почему вместо -and мы не используем -or? Потому что find сканирует файлы и директории, каждые из которых оцениваются на соответствие специфичным тестам.
( файл с плохими разрешениями ) -or ( директория с плохими разрешениями )
Наш следующий вызов – как протестировать на «плохие разрешения». Как мы это делаем? На самом деле мы это не делаем. В действительности мы тестируем на «отсутствие хорошего разрешения», поскольку мы знаем, чем являются «хорошие разрешения». В случае файлов мы определяем хорошие как 0600, а для директорий как 0700. Выражение, которое будет тестировать файлы на «не хорошие» разрешения это:
-type f -and -not -perm 0600
и для директорий:
-type d -and -not -perm 0700
Как отмечено выше в таблице операторов, оператор -and может быть безопасно удалён, поскольку он применяется по умолчанию. Итак, если мы сложим всё вместе, мы получим нашу конечную команду:
find ~ ( -type f -not -perm 0600 ) -or ( -type d -not -perm 0700 )
Тем не менее, поскольку круглые скобки имеют специальное значение для оболочки, мы должны экранировать их, чтобы не дать оболочке их интерпретировать. Этот эффект достигается добавления перед каждой из них символа обратного слеша.
Имеется другая особенность логических операторов, которую важно понимать. Допустим у нас имеется два выражения, разделённых логическим оператором:
expr1 -operator expr2
Во всех случаях expr1 всегда будет выполняться; при этом оператор будет определять, выполняется ли expr2. Как это работает объясняется в таблице логики find И/ИЛИ:
Результат expr1 | Оператор | expr2 |
---|---|---|
True | -and | Всегда выполняется |
False | -and | Никогда не выполняется |
True | -or | Никогда не выполняется |
False | -or | Всегда выполняется |
Почему это делается? Это делается для улучшения производительности. Возьмём, к примеру, -and. Мы знаем, что выражение expr1 -and expr2 не может быть истиной, если результат expr1 является ложью, поэтому нет смысла выполнять expr2.
Похожим образом, если у нас имеется выражение expr1 -or expr2 и результат expr1 является истинной, нет смысла выполнять expr2, поскольку мы уже знаем, что выражение expr1 -or expr2 является истиной.
Хорошо, это помогает более быстрой работе. Почему это так важно? Это важно, поскольку мы можем положиться на это поведения для управления выполняемыми действиями, с которыми мы сейчас познакомимся.