В этой главе рассматривается повседневное использование UNIX: знакомство с командной строкой, безопасность системы и работа в сети.
Презентация 4-01: терминал и командная строка
Основным интерфейсом взаимодействия пользователя с операционной системой UNIX во всех ее модификациях была и остается командная строка. Суть этого интерфейса состоит в обмене текстами с системой: пользователь набирает текстовые команды, а операционная система возвращает ему информацию также в текстовом виде. Несмотря на то, что в современных UNIX-системах широко используются графические пользовательские интерфейсы, командная строка остаётся основным рабочим инструментом администратора системы. Причина этого не в каких-то особенных вкусах администраторов, а в том, что в UNIX-подобных системах командная строка очень хорошо выполняет задачи интерфейса управления системой, она эффективна и удобна — и именно поэтому всеми используется.
Текстовый принцип работы с системой позволяет отвлечься от конкретных частей компьютера, вроде клавиатуры и видеокарты с монитором, рассматривая единое оконечное устройство, посредством которого пользователь вводит текст и передает его системе, а система выводит необходимые пользователю данные и сообщения. Такое устройство называется терминалом. В общем случае терминал — это точка входа пользователя в систему, обладающая способностью передавать текстовую информацию.
Прототипом такого устройства был телетайп, который стал использоваться в качестве средства обмена данными с компьютером еще в 1950-е годы. В современных компьютерах для организации интерфейса командной строки используется клавиатура и экран монитора, работающий в текстовом режиме. Терминалом может быть и отдельное внешнее устройство, подключаемое к компьютеру через порт последовательной передачи данных («COM-порт»).
Современные UNIX-системы предоставляют графические пользовательские интерфейсы (подробнее графическая подсистема UNIX рассматривается в разделе Глава 9, Графическая подсистема UNIX), которые также дают возможность работы в командной строке. Эта возможность достигается с помощью графических терминалов — специальных программ, которые эмулируют текстовый терминал в графическом окне.
Роль терминала может с успехом выполнять и программа, исполняющаяся на сколько угодно удалённом компьютере, связанным с UNIX-системой, например, посредством сети Интернет. В современной практике такой способ доступа очень широко используется для удалённой работы, в особенности для администрирования серверов, которые зачастую устанавливаются в специальных помещениях, доступ в которые затруднен и нежелателен.
Свойство терминала передавать только текст (иначе говоря, последовательности символов) приводит к необходимости операции по управлению вводом и выводом текста тоже кодировать с помощью специальных символов: удаление неправильно введённых символов, команда передать введённый текст системе, перевод строки, графическое выделение выведенного текста и т. п. Такие символы объединяют понятием управляющие символы.
Часть управляющих символов вводится специальными клавишами, предусмотренными для управления вводом текста, такими как Backspace и Enter. Управляющих символов может быть больше, чем нетекстовых клавиш на клавиатуре, в этом случае их необходимо извлекать с помощью какого-либо клавиатурного модификатора, например, Ctrl.
Количество различных управляющих символов зачастую ограничено и оказывается меньше колиечства необходимых команд терминалу. В этом случае для передачи команд используются управляющие последовательности, которые начинаются управляющим символом, за которым следует строго определенное число обычных символов, в данном случае интерпретируемых терминалом как та или иная команда.
Специальные управляющие символы могут быть также зарезервированы для команд межпроцессного взаимодействия (передачи сигналов). В частности, для завершения командной оболочки можно использовать символ конца ввода Ctrl-D. Эту команду интерпретирует при вводе с терминала система. Она же превращает некоторые другие управляющие символы (например, Ctrl-C — «перывание» или Ctrl-Z — «засыпание») в соответствующие сигналы.
Одной из полезных особенностей терминала является позможность его «прокрутки» с помощью клавиш Shift-PgUp и Shift-PgDn. Это может быть полезно, если вывод программы занимает больший объём, чем размер экрана.
Каждое устройство или программа, выполняющие функции терминала, имеет свои возможности по вводу и выводу информации. Примерами таких возможностей являются: число цветов отображения, способность перемещать курсор и изменять размер экрана, набор управляющих символов и т. п. При этом для операционной системы важна возможность работать с любыми терминалами одинаковым способом. Для этого в операционных системах семейства UNIX вводится понятие тип терминала: каждый тип сводится набору возможностей, регламентированных в специальном конфигурационном файле. Информация о всех существующих типах терминалов хранится в специализированной базе данных (terminfo или termcap). Примерами типов являются: tty (телетайп) или xterm (графический терминал).
Презентация 4-02: одновременный доступ к системе
То, что UNIX — многопользовательская и многозадачная система, проявляется не только в разграничении прав доступа (см. раздел «Введение в безопасность UNIX»), но и в организации рабочего места: ничто не препятствует подключить к операционной системе произвольное число терминалов одновременно, в особенности если функции терминала выполняет программа. Благодаря этому каждый компьютер, на котором работает UNIX, предоставляет возможность зарегистрироваться и получить доступ к системе с нескольких терминалов одновременно. Даже если в распоряжении всех пользователей есть только один монитор и одна системная клавиатура, эта возможность небесполезна: одновременная регистрация в системе на нескольких терминалах позволяет работать поочередно с несколькими задачами без необходимости каждый раз их завершать и затем возобновлять.
Характерный для современных версий UNIX способ организации параллельной работы пользователей — виртуальные консоли. Виртуальные консоли (virtual console) — это несколько параллельно выполняемых операционной системой программ, предоставляющих пользователю возможность зарегистрироваться в системе в текстовом режиме и получить доступ к командной строке (см. Рисунок 2.1, «Виртуальные и графические консоли»).
В операционной системе Linux переключение между виртуальными консолями в текстовом
режиме производится с помощью комбинации клавиш
Alt-F1,
Alt-F2 и т. п. При этом
каждая виртуальная консоль обозначается специальным
именем: «tty1», «tty2» и т. д. По умолчанию в Linux
доступно не менее шести виртуальных консолей, переключаться между которыми можно
при помощи сочетания клавиши Alt с одной из функциональных клавиш
(F1-F6). С каждым сочетанием связана
соответствующая по номеру виртуальная консоль. Виртуальные консоли обозначаются
«ttyN», где «N» — номер виртуальной консоли.
На самом деле, каждая из таких конcолей связана с
собственным терминалом, который характеризуется файлом
устройства с соответствующим именем (например, /dev/tty1
).
Также существует возможность запуска нескольких графических подсистем, тогда переключение между ними будет осуществляться аналогично переключению между виртуальными консолями — комбинацией клавиш Ctrl-Alt-F1.
Основная среда взаимодействия с UNIX — командная строка. Суть её в том, что каждая строка, передаваемая пользователем системе, — это команда, которую та должна выполнить. Пока не нажата клавиша Enter, строку можно редактировать, затем она отсылается системе.
Команды, введённые пользователем, интерпретируются и выполняются специальной программой — командной оболочкой (или «shell» по-английски). Через командную оболочку производится управление пользовательскими процессами — для этого используются средства межпроцессного обмена, описанные ранее (см. «Межпроцессное взаимодействие»).
Ввод и вывод командной оболочки непосредственно связан с терминалом, через который осуществляется передача управляющих последовательностей и текста от пользователя и обратно. На рисунке Рисунок 2.2, «Интерфейс командной строки» представлена общая схема взаимодействия пользователя с системой при работе с командной строкой.
Существует несколько различных командных оболочек, используемых для управления системой в UNIX, далее в примерах мы будем рассматривать bash — самую распространенную современную командную оболочку.
Для удобства пользователя командная строка оформляется в виде приглашения — специальной последовательности символов, которую командная оболочка выводит на терминал в знак того, что она готова принять очередную команду. Заодно приглашение командной строки служит целям визуальной организации интерфейса пользователя: прежде всего, она указывает область экрана, где будет отображаться вводимая пользователем команда (непосредственно справа от приглашения, в той же строке), кроме того, в приглашении принято помещать информацию о некоторых текущих свойствах командной оболочки (имени пользователя, текущем каталоге и т. п.) — такая информация выполняет роль «подсказок» пользователю, которые облегчают ориентацию в интерфейсе.
Пример 2.1. Пример выполнения команды
user@desktop ~ $ date Втр Окт 4 23:15:37 MSD 2005 user@desktop ~ $
Здесь приглашением является строка user@desktop ~ $
, которая
содержит: имя пользователя, с правами которого исполняется командная оболочка
(user), имя компьютера (desktop), имя текущего каталога (~, этим символом
в командных оболочках UNIX принято обозначать домашний каталог пользователя).
Заканчивается приглашение символом начала ввода ($), который, по существу,
является единственным обязательным элементом приглашения и показывает собственно
готовность командной оболочки ко вводу команды.
В качестве символа начала ввода могут выступать разные символы, но чаще
всего используется именно ($) для обозначения командной строки обычного
пользователя и символ (#) для обозначения командной строки суперпользователя
(root).
Пользователь имеет возможность произвольным образом изменить оформление
приглашения командной строки.
Презентация 4-03: формат команды
Приведенный выше пример демонстрирует простейшую команду, которая состоит только из имени команды: date. Для исполнения этой команды командная оболочка находит и запускает программу, имя которой совпадает с именем команды. В данном примере это утилита date, которая и выводит на терминал пользователя информацию о текущей дате и времени. Некоторые команды (такие как echo) являются встроенными для данной командной оболочки и для их выполнения вызывается не программа, а внутренняя функция оболочки.
В качестве имени команды, помимо внешней программы и встроенной функции, может выступать еще и псевдоним (alias). Псевдонимы — это определяемые пользователем сокращения, позволяющие заменить длинную, но часто используемую команду, более короткой. В конфигурационных файлах командного интерпретатора пользователя обычно уже определено несколько сокращений, список которых можно посмотреть с помощью команды alias без параметров:
user@desktop ~ $ alias alias cp='cp -i' alias l='ls -lapt' alias ll='ls -laptc' alias ls='ls --color=auto' alias md='mkdir' alias mv='mv -i' alias rd='rmdir' alias rm='rm -i'
Например, по команде ls вместо утилиты /bin/ls bash запускает собственную команду-сокращение, превращающееся в команду ls --color=auto. Повторно появившуюся в команде подстроку "ls" интерпретатор уже не обрабатывает, во избежание вечного цикла. Например, команда ls -al превращается в результате в ls --color=auto -al.
Сокращения не наследуются с окружением.
Однако команды UNIX могут быть устроены и более сложным образом, когда необходимо не только выполнить внешнюю программу, но и передать ей какую-то дополнительную информацию, чтобы так или иначе модифицировать ее работу. Модфикаторы поведения в этом случае вводятся в командной строке после имени команды — это параметры команды. Параметров может быть произвольное количество (оно зависит только от смысла передаваемой внешней программе информации), друг от друга параметры отделяются пробелами. Параметры будут переданы программе в том порядке, в котором они указаны в командной строке.
Пример 2.2. Пример выполнения команды c параметром
user@desktop ~ $ cal 1 2006 Января 2006 Вс Пн Вт Ср Чт Пт Сб 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Командная оболочка передает внешней программе ее параметры не в виде единой строки, как их ввел пользователь, а в виде упорядоченного списка (первый параметр, второй параметр...). Для этого командную строку необходимо разбить на отдельные «слова». При разбиении на слова командная оболочка использует понятие разделитель (delimiter). Разделитель — это символ, разделяющий слова; таким образом командная строка — это последовательность слов (которые имеют значение) и разделителей (которые значения не имеют). Для командной оболочки разделителями являются символ пробела, символ табуляции и символ перевода строки. Количество разделителей между двумя соседними словами значения не имеет. Если необходимо передать в качестве параметра строку, содержащую символы-разделители, необходимо эту строку окружить одинарными или двойными кавычками.
user@desktop ~ $ echo "Hello, world." Hello, world.
Параметры, которые могут быть переданы команде, подразделяются на два вида: первые — это внешние объекты, с которыми должна работать вызываемая команда (например, имена файлов, числа), вторые — это принимаемые программой модификаторы поведения. Последовательность в командной строке обычно такая: имя команды — модификаторы — объект(ы), где и модификаторы, и объекты необязательны.
В программах для UNIX параметры-модификаторы принято называть ключами (а также опциями и иногда флагами).
Для формата ключей нет жёсткого стандарта, однако существуют договорённости,
нарушать которые не принято. Так, ключи должны начинаться на символ
«-» и могут быть однобуквенными (как -h
) или полнословными (например, --help
). Особый вид ключей —
параметрические, которые принимают собственный параметр: например, в коменде
grep -f access.log -n test имя файла
access.log
— часть параметра -f
.
Проблемы могут возникнуть, если с символа «-» начинается не ключ, а обычный параметр, например, имя файла. В этом случае команда может интерпретировать этот параметр как ключ, что повлечет ошибку. Для выхода из этой ситуации используется специальная конструкция «--», указывающая, что список ключей закончен и любые последующие строки следует интерпретировать как параметры. Например:
user@desktop ~ $ ls -l -- -test-file -rw-r--r-- 1 user users 90 Сен 19 00:20 -test-file
Если же нужно работать сразу с несколькими объектами, например, перемещать группу файлов в другой каталог, перечислять их все в качестве параметров команды перемещения будет неэффективно. Необходим способ задать одно «общее» имя для группы файлов, с которыми будет работать команда. В подавляющем большинстве случаев это можно сделать при помощи шаблона.
Шаблон в командном интерпретаторе используется примерно в тех же целях, что и регулярное выражение, которое будет описано в разделе «Команды, использующие регулярные выражения»: для поиска строк определенной структуры среди множества разнообразных строк. В отличие от регулярного выражения, шаблон всегда примеряется к строке целиком, кроме того, он устроен значительно проще (а значит, и беднее).
Символы в шаблоне разделяются на обычные и специальные. Обычные символы соответствуют таким же символам в строке, а специальные — обрабатываются особым образом:
Шаблону, состоящему только из обычных символов, соответствует единственная
строка, состоящая из тех же символов в том же порядке. Например, шаблону
«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. Главное место их применения — командная строка. Если оболочка «видит» в командной строке шаблон, она немедленно заменяет его списком файлов, имена которых ему соответствуют. Команда, которая затем вызывается, получает в качестве параметров список файлов уже без всяких шаблонов, как если бы этот список пользователь ввел вручную.
По умолчанию, ввод и вывод каждой команды, выполняемой в командной строке, связан с терминалом, за которым работает пользователь. Однако командная оболочка предусматривает средства перенаправления ввода и вывода команд. Один из самых важных случаев — перенаправление ввода/вывода в файл и из файла. Для этого в командной строке используются специальные символы >, >> и <. Символы перенаправления указываются в командной строке после всех параметров команды, за символом перенаправления должно следовать имя файла, в который или из которого следует передать данные.
user@desktop ~ $ date > /tmp/date user@desktop ~ $ cat < /tmp/date Втр Окт 4 23:15:37 MSD 2005 user@desktop ~ $
В данном примере вывод команды date перенаправляется в файл
/tmp/date
(при этом если такой файл
существовал, то он будет уничтожен и создан заново с нуля), а затем команде cat
перенаправляется на ввод содержимое этого файла. Обратите
внимание, здесь команда cat выполняется без
параметров, она получает содержимое файла
/tmp/date
непосредственно со стандартного
ввода, как если бы пользователь ввел его прямо с
терминала. Обращение к файлу и передачу данных выполняет в
этом случае командная оболочка.
Современные оболочки, в том числе и bash, предусматривают также специальные символы для особых случаев перенаправления, в частности, >> служит для недеструктивного перенаправления в файл (данные не заместят содержимое файла, а будут дописаны в конец) или &> для направления в один файл двух потоков: стандартного вывода и стандартного вывода ошибок.
Презентация 4-04: программное окружение
В командной оболочке можно просматривать и изменять переменные окружения, которые соответствуют процессу оболочки (о переменных окружениях уже было сказано в разделе «Переменные окружения»). Программы могут исполняться по-разному, в зависимости от значений переменных окружения:
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
В большинстве UNIX-систем существует набор переменных окружения, сопровождающих все процессы системы. При старте командной оболочки, инициализируется это множество системных переменных. Их можно посмотреть с помощью команды env. Некоторые из них представляют особый интерес для пользователя системы:
DISPLAY
Переменная используется графической подсистемой X11 и указывает на адрес X-сервера и номер используемого экрана (подробнее об этом будет сказано в разделе Глава 9, Графическая подсистема UNIX).
EDITOR
Если какая-то утилита требует редактирования файла, то вместо
написания и использования встроенного редактора, этот файл можно
передать на редактирование программе, путь к которой хранится в
переменной EDITOR
.
HOME
Переменная сожержит имя домашней директории текущего пользователя.
PATH
Переменная окружения содержит список директорий, разделённый символом «:». Этот список просматривается при каждом запуске команды — в нём производится поиск исполнемых файлов с соответвтующем команде именем. Примером значения переменной окружения может быть «/bin:/usr/bin:/usr/local/bin».
Как правило, значение этой переменной различается для простого пользователя и администратора — для того, чтобы разделить их рабочий инструментарий.
SHELL
Имя текущей программы оболочки.
TERM
Тип терминала, используемого в настоящий момент. Эта переменная анализируется программами для того, чтобы варьировать свой интерфейс в зависимости от возможностей терминала.
USER
Имя текущего пользователя.
_
(одиночный символ подчёркивания)В точности последняя команда, выполненная в командной оболочке.
Презентация 4-05: служебные символы
Из предыдущих разделов видно, что некоторые символы используются в качестве команд самой командной оболочке, например, символы перенаправления ввода/вывода — служебные символы. Поскольку служебные символы адресованы самой командной оболочке, то при обработке командной строки они из нее «изымаются» и не передаются выполняющейся команде. Чтобы передать команде параметр, содержащий служебные символы, необходимо их тем или иным способом экранировать. С одним из способов экранирования — заключением параметра в одинарные или двойные кавычки — мы уже сталкивались раньше, когда говорили о параметрах, содержащих символы-разделители. Другой распространённый способ — постановка символа обратной косой черты (\) непосредственно перед служебным символом.
Рассмотрим основные группы служебных символов командной оболочки:
Используются для отлеления частей команды или нескольких команд. К ним относятся: пробел, табуляция. По умолчанию команды разделяются символом перевода строки.
Используются для разделения элементов пути. Сюда можно отнести символ корня («/») и символ домашней директории («~») — в командной строке он автоматически заменяется на полный путь к домашней директории.
Применяются в аргументах команд, для отделения нескольких команд, для запуска процессов на заднем фоне и т.п. К таким символам можно отнести: «*», «&», «<», «>», «;», «(», «)», «|», «"».
Используются для задания («=») и подстановки («$») значений переменных среды. При этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
Для использования перечисленных выше специальных символов в именах файлов, необходимо перед ними использовать знак обратной косой: «\&», «\;» и т. п. К этой же группе относятся специальные ASCII-символы, зарезервированные для команд вывода текста, например, символ возврата каретки или табуляции («\n» и «\t» соответственно).
Презентация 4-06: исполнение команды
Командная оболочка — это обычный процесс в операционной системе UNIX. Когда пользователь вводит команду (например, по нажатию Enter), командная оболочка выполняет следующие действия:
Презентация 4-07: возвращаемое значение
Каждый процесс при завершении возвращает своему родительскому процессу специальный код завершения программы. Этот код может использоваться для получения результата выполнения программы и для проверки корректности её выполнения (возврата кода ошибки).
Традиционно для UNIX, в случае успешного выполнения программа (а также
большинство системных функций) возвращает значение 0
. Другие
значения (все, отличные от 0
) означают тот или иной вид
ошибки. Так как программы часто выводят инфоромацию об ошибках через специальный
поток вывода ошибок (stderr), возвращаемые значения чаще
всего могут принимать только два значения: «ноль» и «не
ноль».
Если рассмотреть простейший пример программы на языке C:
Пример 2.3. Возвращаемое значение в программе на языке C
int main(int argc, char* argv[]) { ... if(error) { exit(1); } ... return 0; }
видно, что программы передают код завершения через возвращаемое значение
главной функции (main
) или как параметр
функции exit
.
В командной строке результат выполнения программы можно проанализировать с
помощью специальной переменной ($?
):
user@desktop ~ $ test -f /tmp/file.txt user@desktop ~ $ echo $? 0
Презентация 4-08: возможности командной оболочки
При первом знакомстве командная строка может производить впечатление сложного и неудобного интерфейса. При более внимательном изучении и использовании выясняется, что в этом принципе построения интерфейса есть внутренние ресурсы, позволяющие строить эффективную и удобную рабочую среду. В этом разделе мы кратко обсудим два принципиальных способа достижения эффективности.
Во-первых, посольку командная строка — основной интерфейс взаимодействия с системой в UNIX-подобных операционных системах, пользователь значительную часть времени работает с командной строкой. Поэтому для пользователя очень важны средства экономии усилий, позволяющие свести к минимуму число интерфейсных жестов (в случае командной строки в качестве жестов выступают главным образом нажатия на клавиши). Современные командные оболочки UNIX-систем включают целый ряд средств для экономии нажатий, основные мы перечислим ниже.
Второй путь к эффективному использованию командной строки заложен в самой природе командного языка как типа интерфейса. Так, язык любой командной оболочки UNIX предоставляет гибкие средства объединения команд, которые позволяют запрограммировать логику взаимодействия нескольких программ в виде одной, пусть сложной, команды в командной строке. Дополнительной особенностью UNIX являются гибкие возможности объединения ввода/вывода разных команд. Так, одной командой могут быть описаны весьма сложные многоступенчатые действия, вовлекающие произвольное количество объектов, например, сотни файлов. Таким образом, одна команда способна заменить сотни монотонных повторений однотипных действий.
По существу, все средства интеграции команд — операторы циклов, условные операторы, присваивания переменных — в совокупности составляют полноценный язык программирования, интерпретатором которого и является командная оболочка. А все утилиты, имеющиеся в системе, можно считать его операторами. Так, последовательность команд shell, записанная в файл при соблюдении определённых правил представляет собой готовую к выполнению самостоятельную программу — командный сценарий (в обиходе именуемый калькой с английского скрипт).
Программирование на shell выходит за рамки данного курса, однако ниже будут рассмотрены основные средства связывания команд, необходимые любому пользователю.
Вводимую команду можно редактировать с помощью клавиш Backspace и Delete, перемещаться стрелками по всей строке. При редактировании полезны функции Ctrl-W — удаление слова перед курсором и Ctrl-U — удаление всей строки.
Двумя другими клавишами со стрелками — вверх и вниз — задействуется весьма мощный механизм bash — работа с историей команд. Все команды, набранные пользователем, командная оболочка запоминает и позволяет обращаться к ним впоследствии. По стрелке вверх, список поданных команд «прокручивается» от последней к первой, а по стрелке вниз — обратно. Соответствующая команда отображается в командной строке как только что набранная, её можно отредактировать и подать оболочке (подгонять курсор к концу строки при этом необязательно).
Чтобы история команд могла сохраняться между сеансами
работы пользователя, bash записывает ее в файл
.bash_history
, находящийся в домашнем каталоге
пользователя. Делается это в момент завершения оболочки: накопленная за время
работы история дописывается в конец этого файла. При следующем запуске командной
оболочки считывает .bash_history
целиком. История хранится
не вечно, количество запоминаемых команд в .bash_history
ограничено (обычно сохраняется 500 команд, но это можно и перенастроить).
Автодополнениe позволяeт быстро набирать команды и имена файлов. Во время набора имени команды или файла пользователь может нажать клавишу Tab, и командная оболочка попытается «дополнить» указанную команду или файл: предложит возможные варианты с данным началом или же дополнит имя, ведь часто набранной строки — пути к файлу и нескольких первых букв его имени — достаточно для однозначного указания на этот файл, потому что по введенному пути других файлов, чье имя начинается на эти буквы, просто нет.
Презентация 4-09: средства объединения команд
Существует возможность объединять несколько команд в одной командной строке. Это можно делать несколькими способами:
Команды выполняются одна за другой, независимо от результата их исполнения. В качестве разделителя выступает символ точки с запятой («;»).
В качестве примера можно рассмотреть составную команду
mkdir /tmp/test; cd /tmp/test,
которая сначала создает каталог
/tmp/test
, а затем делает его
текущим.
Проверяется код завершения первой программы, если он
равен 0
, производится выполнение второй программы, и
так далее. Таким образом, последняя команда выполнится только при
успешном завершении всех предыдущих. В качестве разделителя выступают
два амперсанда
(«&&»).
Например, команда
mkdir /tmp/test && cd /tmp/test
создает каталог /tmp/test
, но
переход в этот каталог будет выполнен только в том
случае, если выполнении первой части не возникло ошибки
(например, каталог может уже существовать, и создать его невозможно).
Проверяется код завершения первой программы, если он
не равен 0
, производится
выполнение второй программы, и так далее. Последняя команда будет
запущена только если ни одна из предыдущих не закончилась успешно. В
качестве разделителя выступают две вертикальный черты
(«||»).
В качестве примера можно рассмотреть составную команду
test -d /tmp/test || mkdir /tmp/test, которая
проверяет существование директории /tmp/test
и если
её нет, создаёт её.
При выполнении списка команд, объединённых в конвейер, стандартный вывод команды направляется на стандартный ввод следующей за ней команды в конвейере напрямую. Передаваемые данные рассматриваются как текстовые, передача производится построчно. Таким образом возникает поток данных, проходящих через несколько команд последовательно, как по конвейеру. Этот механизм является одной из самых фундаментальных особенностей UNIX и широко используется при работе в командной стоке.
Все программы могут быть запущены одновременно, так чтобы обеспечить интерактивность вывода при прохождении данных через цепочку программ. Если одна из программ в цепочке конвейера завершится (например, в случае ошибки), остальным будет отправлен специальный сигнал (SIGPIPE).
В качестве разделителя команд в конвейере используется символ вертикальный черты («|»).
Рассмотрим пример команды cat file.txt | uniq | sort,
которая читает содержимое файла file.txt
, удаляет
из него повторяющиеся строки и сортирует оставшиеся строки по
алфавиту. Результат выводится на экран.
Современные командные оболочки позволяют строить более гибкие условные выражения (с импользованием скобок и знака отрицания) из выполняющихся команд.
Презентация 4-10: справочная подсистема
Работать с UNIX, не заглядывая в документацию, практически невозможно. Это возможно, потому что документированы практически все области операционной системы. Всем пользователям настоятельно рекомендуется, приступая к работе, а тем более — к изучению UNIX, пользоваться всеми доступными руководствами. Исторически первым и основным средством документации во всех версиях являются страницы руководства (manual pages), которые будут подробно рассмотрены далее.
Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский — не родной язык для автора документации, она будет только проще. Традиция писать по-английски идет от немалого вклада США в развитие компьютерной науки вообще и UNIX в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием UNIX. Дело не в том, что страницу руководства нельзя перевести, а в том, что ее придется переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации.
Документация в UNIX играет важнейшую роль. Решение любой задачи должно начинаться с изучения руководств. Не стоит жалеть на это времени. Даже если рядом есть опытный пользователь UNIX, который, возможно, знает ответ, не стоит беспокоить его сразу же. Возможно, даже зная, что нужно сделать, он не помнит как именно — и поэтому (а также потому, что он — опытный пользователь) начнет с изучения руководства. Это — закон, у которого даже собственное название: RTFM, что означает «Read That Fine Manual».
Современные свободные UNIX-системы обладают большим сообществом пользователей и разработчиков, объединённых через Интернет. В этих сообществах является нормальной практикой взаимопомощь и ответы на вопросы по системе. Однако здесь необходимо следовать описанному выше принципу RTFM.
Презентация 4-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.
В современных свободных версиях UNIX существуют проекты, целью которых является унификация и систематизация документации на основе XML. Наиболее известный из них — проект Scrollkeeper, который объединяет всю документацию (в первую очередь в современных оконных средах GNOME и KDE) и позволяют просматривать её с помощью простого браузера, предоставляют средства поиска, построения оглавления и указателей и т. п.
Однако подобные средства документации используются очень ограниченно, а роль основного истоника документации в UNIX-системах по-прежнему сохраняют страницы руководства. Возможно, причина этого в «распределённой» природе руководств: нет общего места, где сложены все руководства системы. Напротив, каждое руководство посвящено определённому объекту системы, дает конкретные сведения, необходимые в конкретной ситуации и доступно в любой командной строке, то есть всегда находится «под рукой».
Командная строка UNIX является основным средством интерфейсом взаимодействия с системой, как для администратора, так и для пользователя системы. Это происходит еще и потому, что в настоящее время широко распространены средства удалённой работы с системой через сетевые терминалы.
Интерфейс командной строки реализуется посредством терминала — логического или физического устройства, способного принимать и передавать текстовые данные — и связанного с терминалом процесса — командной оболочки, которая организует интерактивную работу пользователя, интерпретирует команды пользователя и передает их на выполнение системе.
Команда строится по стандартной схеме: имя команды — модификаторы (ключи) — прочие параметры. В качестве имени команды может выступать название внешней программы, встроенной функции или сокращение (alias).
При обработке командной строки служебные символы интерпретируются самой командной оболочкой и не передаются в качестве параметров командам. Чтобы включить служебные символы в состав параметра, их необходимо экранировать.
Документация — необходимый инструмент при работе в
UNIX. Основной вид документ — страницы руководств
(man). Также следует обращаться к расширенной обучающей
документации (info) и к документации, поставляемой вместе с
программой (которую можно найти в каталоге /usr/share/doc
).
Ключевые термины: терминал, графический терминал, управляющие символы, управляющая последовательность, тип терминала, виртуальная консоль, командная строка, командная оболочка, приглашение, имя команды, встроенная команда, псевдоним, параметры команды, ключ, шаблон, служебные символы, код завершения, сценарий, история команд, конвейер, страница руководства