Введение в администрирование UNIX/Командная строка UNIX

Материал из Викиучебника — открытых книг для открытого мира

Операционная система предоставляет пользователю специальный интерфейс – командную строку, через которую пользователи получают персональную рабочую среду. Несмотря на то, что в современных UNIX-системах широко используются графические пользовательские интерфейсы, командная строка остаётся основным рабочим инструментом администратора системы.

Терминал и командная строка[править]

Презентация 3-01: терминал и командная строка
Презентация 3-01: терминал и командная строка

Терминал[править]

В операционной системе UNIX основными средствами взаимодействия пользователя с системой являются клавиатура и экран монитора, работающий в текстовом режиме. Вводимый пользователем текст немедленно отображается на мониторе соответствующими знаками, однако может и не отображаться (например, в случае ввода пароля). Для управления вводом используются некоторые нетекстовые клавиши на клавиатуре: Backspace (он же «Забой») — для удаления последнего введенного символа или Enter — для передачи команды системе. Нажатие на эти клавиши не приводит к отображению символа, вместо этого вводимый текст обрабатывается системой тем или иным способом — эти клавиши и их комбинации объединяют понятием управляющие символы.

Текстовый принцип работы с машиной позволяет отвлечься от конкретных частей компьютера, вроде системной клавиатуры и видеокарты с монитором, рассматривая единое конечное устройство, посредством которого пользователь вводит текст и передает его системе, а система выводит необходимые пользователю данные и сообщения. Такое устройство называется терминалом. В общем случае терминал — это точка входа пользователя в систему, обладающая способностью передавать текстовую информацию. Терминалом может быть отдельное внешнее устройство, подключаемое к компьютеру через порт последовательной передачи данных («COM-порт»). В роли терминала может работать (с некоторой поддержкой со стороны системы) и программа (например, xterm или ssh).

Свойство терминала передавать только символьную информацию приводит к тому, что некоторые из передаваемых символов должны восприниматься не как текстовые, а как управляющие (например, символы, возвращаемые клавишами Backspace и Enter). На самом деле управляющих символов больше: часть из них предназначена для экстренной передачи команд системе, часть — для редактирования вводимого текста. Многие из этих символов не имеют специальной клавиши на клавиатуре, поэтому их необходимо извлекать с помощью клавиатурного модификатора Ctrl. Проблема в том, что на клавиатуре может быть так много разных нетекстовых клавиш, что на них не хватает ограниченного количества разных управляющих символов. Поэтому большинство нетекстовых клавиш возвращают так называемую управляющую последовательность, которая начинается управляющим символом, за которым следует строго определенное число обычных символов.

Одной из полезных особенностей терминала является возможность его «прокрутки» с помощью клавиш Shift-PgUp и Shift-PgDn. Это может быть полезно, если вывод программы занимает больший объём, чем размер экрана.

Командная оболочка[править]

Основная среда взаимодействия с UNIX — командная строка. Суть её в том, что каждая строка, передаваемая пользователем системе, — это команда, которую та должна выполнить. Пока не нажата клавиша Enter, строку можно редактировать, затем она отсылается системе.

Команды интерпретируются и выполняются специальной программой — командной оболочкой (или «shell», по-английски). Через командную оболочку производится управление пользовательскими процессами — для этого используются средства межпроцессного обмена, описанные ранее (см. «Межпроцессное взаимодействие»).

Командная оболочка непосредственно связана с терминалом, через который осуществляется передача управляющих последовательностей и текста. На рисунке Рисунок 2.1, «Интерфейс командной строки» представлена общая схема взаимодействия пользователя с системой при использовании командной строки.

Интерфейс командной строки
Интерфейс командной строки
Рисунок 2.1. Интерфейс командной строки

Одновременный доступ к системе[править]

Презентация 3-02: одновременный доступ к системе
Презентация 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.

Виртуальные и графические консоли
Виртуальные и графические консоли
Рисунок 2.2. Виртуальные и графические консоли

Каждое устройство терминала имеет свои возможности по вводу и выводу информации. Примерами таких возможностей являются: число цветов отображения, способность перемещать курсор и изменять размер экрана, набор управляющих символов и т. п.. Терминалы разделяют по типам: набору возможностей, регламентированных в специальном конфигурационном файле. Примерами типов являются: tty (телетайп) или xterm (графический терминал). Тип терминала явно указан в имени устройства терминала (например, /dev/tty1). Все настройки типов терминалов находятся в директории /etc/termcap.

Формат командной строки[править]

Презентация 3-03: формат командной строки
Презентация 3-03: формат командной строки

Приглашение[править]

Командная строка состоит из приглашения и вводимой команды. Приглашение — это специальная последовательность символов, которая располагается в начале строки и задает начало области ввода команды. Рассмотрим пример выполнения команды:

Пример 2.1. Пример выполнения команды

user@desktop ~ $ date
Втр Окт  4 23:15:37 MSD 2005
user@desktop ~ $

Здесь приглашением является строка user@desktop ~ $, которая помимо символа начала ввода ($) содержит информацию об имени пользователя, имени компьютера и текущей директории.

Формат команды[править]

Каждая команда 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-04: исполнение команды
Презентация 3-04: исполнение команды

Командная оболочка — это обычный процесс в операционной системе UNIX. Когда пользователь вводит команду (например, по нажатию Enter), командная оболочка выполняет следующие действия:

  1. анализ команды: выделение имени, параметров и аргументов;
  2. если это встроенная команда, для неё вызывается функция-обработчик;
  3. если это внешняя команда:
    1. производится поиск программы с соответствующим именем;
    2. создаётся дочерний процесс оболочки (системный вызов fork);
    3. в дочернем процессе запускается необходимая команда с расшифрованными параметрами и аргументами (системный вызов exec);
    4. оболочка контролирует выполнение дочернего процесса, передаёт ему сигналы и ввод пользователя, ожидает его завершения (системный вызов wait);
  4. результаты работы возвращаются пользователю, отображается приглашение — он может вводить следую команду.
Запуск команды оболочкой
Запуск команды оболочкой
Рисунок 2.3. Запуск команды оболочкой

Возвращаемое значение[править]

Презентация 3-05: возвращаемое значение
Презентация 3-05: возвращаемое значение

Каждый процесс при завершении возвращает своему родительскому процессу специальный код завершения программы. Этот код может использоваться для получения результата выполнения программы и для проверки корректности её выполнения (возврата кода ошибки).

Традиционно для UNIX, в случае успешного выполнения программа (а также большинство системных функций) возвращает значение 0. Другие значения (все, отличные от 0) означают тот или иной вид ошибки. Так как программы часто выводят информацию об ошибках через специальный поток вывода ошибок (stderr), возвращаемые значения чаще всего могут принимать только два значения: «ноль» и «не ноль».

Если рассмотреть простейший пример программы на языке C:

Пример 2.2. Возвращаемое значение в программе на языке 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

Способы объединения команд[править]

Презентация 3-06: способы объединения команд
Презентация 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: служебные символы
Презентация 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: программное окружение
Презентация 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: возможности командной оболочки
Презентация 3-09: возможности командной оболочки

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

Редактирование командной строки[править]

Вводимую команду можно редактировать с помощью клавиш Backspace и Delete, перемещаться стрелками по всей строке.

Для управления запущенными командами используются сочетания клавиш. Ввод следует завершать командой Ctrl-D (конец ввода). Эту команду интерпретирует при вводе с терминала система. Она же превращает некоторые другие управляющие символы (например, Ctrl-C — «прерывание» или Ctrl-Z — «засыпание») в сигналы.

Командная оболочка позволяет настраивать все функциональные клавиши и команды. Настройки ввода для bash располагаются в файле /etc/inputrc.

История команд[править]

Двумя другими клавишами со стрелками — вверх и вниз — задействуется весьма мощный механизм bash — работа с историей команд. Все команды, набранные пользователем, командная оболочка запоминает и позволяет обращаться к ним впоследствии. По стрелке вверх, список поданных команд «прокручивается» от последней к первой, а по стрелке вниз — обратно. Соответствующая команда отображается в командной строке как только что набранная, её можно отредактировать и подать оболочке (подгонять курсор к концу строки при этом необязательно).

Чтобы история команд могла сохраняться между сеансами работы пользователя, bash записывает ее в файл .bash_history, находящийся в домашнем каталоге пользователя. Делается это в момент завершения оболочки: накопленная за время работы история дописывается в конец этого файла. При следующем запуске командной оболочки считывает .bash_history целиком. История хранится не вечно, количество запоминаемых команд в .bash_history ограничено (обычно сохраняется 500 команд, но это можно и перенастроить).

Псевдонимы[править]

Поиск по истории — удобное средство: длинную командную строку можно не набирать целиком, а отыскать и использовать. Однако давнюю команду придется добывать с помощью нескольких нажатий клавиши вверх — а можно и совсем не доискаться, если она уже выбыла оттуда. Для того чтобы оперативно заменять длинные команды короткими, стоит воспользоваться псевдонимами (aliases). В конфигурационных файлах командного интерпретатора пользователя обычно уже определено несколько сокращений, список которых можно посмотреть с помощью команды 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.

Сокращения не наследуются с окружением.

Автодополнение[править]

Автодополнения позволяют быстро набирать команды и пути в файловой системе. Во время набора имени команды или файла пользователь может нажать клавишу Tab, и командная оболочка попытается «дополнить» указанную команду или файл: предложит возможные варианты с данным началом или же дополнит имя, ведь часто набранной строки — пути к файлу и нескольких первых букв его имени — достаточно для однозначного указания на этот файл, потому что по введенному пути других файлов, чье имя начинается на эти буквы, просто нет.

Шаблоны[править]

Автодополнение очень удобно, когда цель пользователя — задать один конкретный файл в командной строке. Если же нужно работать сразу с несколькими файлами — например, для перемещения их в другой каталог с помощью 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 и aaabbbc, но не будут соответствовать abc («?» соответствует подстрока c, а для «c» соответствия не находится), @ab@c (нет соответствия для «a») и abbcd.

Шаблоны используются в нескольких конструкциях shell. Главное место их применения — командная строка. Если оболочка «видит» в командной строке шаблон, она немедленно заменяет его списком файлов, имена которых ему соответствуют. Команда, которая затем вызывается, получает в качестве параметров список файлов уже без всяких шаблонов, как если бы этот список пользователь ввел вручную.

Командная оболочка как средство программирования[править]

Большая часть того, что нужно начинающему пользователю UNIX, делается с помощью одной правильной команды, или вызовом нескольких команд в конвейере. От пользователя только требуется оформить решение задачи в виде сценария на shell. На самом же деле уже самый первый из командных интерпретаторов, sh, был настоящим высокоуровневым языком программирования — если, конечно, считать все утилиты системы его операторами. При таком подходе от sh требуется совсем немного: возможность вызывать утилиты, возможность свободно манипулировать результатом их работы и несколько алгоритмических конструкций (условия и циклы).

Программирование на shell, а также других, более мощных интерпретируемых языках в UNIX, остается за рамками этого курса.

Справочная подсистема[править]

Презентация 3-10: справочная подсистема
Презентация 3-10: справочная подсистема

Работать с UNIX, не заглядывая в документацию, практически невозможно. К счастью, документированы практически все области операционной системы. Всем пользователям настоятельно рекомендуется, приступая к работе, а тем более — к изучению UNIX, пользоваться всеми доступными руководствами. Исторически первым и основным средством документации во всех версиях являются страницы руководства (manual pages), которые будут подробно рассмотрены далее.

Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский — не родной язык для автора документации, она будет только проще. Традиция писать по-английски идет от немалого вклада США в развитие компьютерной науки вообще и UNIX в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием UNIX. Дело не в том, что страницу руководства нельзя перевести, а в том, что ее придется переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации.

Документация в UNIX играет важнейшую роль. Решение любой задачи должно начинаться с изучения руководств. Не стоит жалеть на это времени. Даже если рядом есть опытный пользователь UNIX, который, возможно, знает ответ, не стоит беспокоить его сразу же. Возможно, даже зная, что нужно сделать, он не помнит как именно — и поэтому (а также потому, что он — опытный пользователь) начнет с изучения руководства. Это — закон, у которого даже собственное название: RTFM, что означает «Read That Fine Manual».

Современные свободные UNIX-системы обладают большим сообществом пользователей и разработчиков, объединённых через Интернет. В этих сообществах является нормальной практикой взаимопомощь и ответы на вопросы по системе. Однако, здесь необходимо следовать описанному выше принципу RTFM.

Страницы руководcтва[править]

Презентация 3-11: страницы руководств (man)
Презентация 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 разделов руководств:

  1. пользовательские утилиты и прочие инструменты
  2. системные вызовы
  3. библиотечные функции
  4. внешние устройства (и их представление в системе)
  5. форматы и таблицы (типы файлов, протоколы и прочее)
  6. игры и всевозможные «ненужные» утилиты
  7. «остальное», то есть то, что не подходит под другие разделы
  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

Программа info[править]

Другой источник информации о 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 систем остаются страницы руководств.

Резюме[править]

Презентация 3-12: резюме
Презентация 3-12: резюме

Командная строка UNIX является основным средством работы администратора системы. Это происходит еще и потому, что в настоящее время широко распространены средства удалённой работы с системой через сетевые терминалы.

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

Командная строка имеет строго определённый формат и состоит из приглашения и команды. Команда может иметь параметры и аргументы. Каждая команда возвращает специальный код завершения. Несколько команд могут быть объединены в одну.

Каждый процесс имеет свое программное окружение, которое достаётся ему в наследство от родительского процесса. Окружение состоит из переменных, среди которых выделяют ряд стандартных.

Современные командные оболочки (в частности, bash) имеют ряд дополнительных удобных возможностей интерфейса пользователя, например, псевдонимы, автодополнение, шаблоны имен и встроенные средства программирования.

В UNIX существует огромное количество документации, основная часто которой сосредоточена в страницах руководств (man). Также выделяют расширенные руководства (info) и документацию, поставляемую с программой (которую можно найти в директории /usr/share/doc).

Ключевые термины:управляющие символы, терминал, управляющая последовательность, командная строка, командная оболочка, виртуальная консоль, графический терминал, тип терминала, приглашение, имя команды, встроенная команда, параметры команды, аргументы команды, перенаправление ввода-вывода, код завершения, конвейер, служебные символы, окружение, переменная окружения, история команд, псевдоним, шаблон, страница руководства

Дополнительные материалы[править]

  1. Д. Тейнсли Linux и UNIX: программирование в shell. Руководство разработчика. — К.: Издательская группа BHV, 2001. — 464 с.: ил.
  2. Курячий Г. В., Маслинский К. А. Операционная система Linux. — М.: Интуит. Ру, 2005. — 392 с.: ил.
  3. Курячий Г. В. Операционная система UNIX. — М.: Интуит. Ру, 2004. — 292 с.: ил.
  4. Соловьёв А. Программирование на shell. — http://www.linuxcenter.ru/lib/books/shell/

Вопросы[править]

  1. Что такое терминал? Какие бывают терминалы?
  2. Командная строка UNIX: из каких частей состоит, основные управляющие клавиши, примеры команд?
  3. Что такое командная оболочка? Что происходит при запуске команды?
  4. Какие существуют способы объединения команд? Чем они отличаются?
  5. Что такое программное окружение? Какие стандартные переменные окружения существуют в UNIX?
  6. Что входит в справочную систему UNIX?

Презентация[править]

Рисунок 2.4. Презентация 3-01: терминал и командная строка Презентация 3-01: терминал и командная строка

Рисунок 2.5. Презентация 3-02: одновременный доступ к системе Презентация 3-02: одновременный доступ к системе

Рисунок 2.6. Презентация 3-03: формат командной строки Презентация 3-03: формат командной строки

Рисунок 2.7. Презентация 3-04: исполнение команды Презентация 3-04: исполнение команды

Рисунок 2.8. Презентация 3-05: возвращаемое значение Презентация 3-05: возвращаемое значение

Рисунок 2.9. Презентация 3-06: способы объединения команд Презентация 3-06: способы объединения команд

Рисунок 2.10. Презентация 3-07: служебные символы Презентация 3-07: служебные символы

Рисунок 2.11. Презентация 3-08: программное окружение Презентация 3-08: программное окружение

Рисунок 2.12. Презентация 3-09: возможности командной оболочки Презентация 3-09: возможности командной оболочки

Рисунок 2.13. Презентация 3-10: справочная подсистема Презентация 3-10: справочная подсистема

Рисунок 2.14. Презентация 3-11: страницы руководств (man) Презентация 3-11: страницы руководств (man)

Рисунок 2.15. Презентация 3-12: резюме Презентация 3-12: резюме

Методические указания по основным командам UNIX[править]

Описание команд разбито на несколько разделов – по функциональному назначению команд.

Команды по работе с файловой системой[править]

pwd
Команда pwd (print working directory – печать pабочего каталога) позволяет узнать имя текущего каталога:
user@desktop / $ pwd
/
Т.е. в настоящее вpемя Вы находитесь в коpневом каталоге.
Если в пpоцессе путешествия по файловой системе вы «потеpялись» и не знаете, где находитесь, пpосто набеpите эту команду, котоpая выведет на экpан полное имя текущего каталога, начиная от коpневого.
Если вместо имени текущего каталога на экpан будет выдано диагностическое сообщение типа: Cannot open.. («Не может открыть..») и Read error in.. («Ошибка считывания в..»), то значит пpоизошло наpушение файловой системы, возможно у Вас не хватает прав на чтение этой директории.
cd
Команда cd (change directory) используется для смены текущего каталога, т.е. для пеpехода в дpугой каталог и является встpоенной командой оболочки (аналог соответствующей команды для DOS-систем). В качестве аpгумента этой команды укажите имя каталога, в котоpый Вы хотите пеpейти. Напpимеp:
Например, cd /etc – пеpейти в каталог /etc, т.е. сделать его текущим.
Если Вы хотите пеpейти в подкаталог, то «/» не указывается. Допустим Вы находитесь в каталоге /usr и вам надо пеpейти в каталог local, котоpый является подкаталогом этого каталога. В этом случае вы можете выполнить следующие действия:
    user@desktop usr $ pwd
    /usr
    user@desktop usr $ cd local
    user@desktop local $ pwd
    /usr/local
Таким обpазом, каталог /usr/local стал текущим.
Если ввести команду cd без аpгументов, то вы веpнетесь в свой домашний (начальный) каталог. Пpи этом используется системная пеpеменная окружения HOME.
    user@desktop usr $ cd
    user@desktop ~ $ pwd
    /home/user
Пpиведем еще несколько пpимеpов использования этой команды:
  • cd .. – веpнуться в pодительский каталог (подняться на один каталог ввеpх по деpеву);
  • cd ../.. – подняться на два каталога ввеpх по деpеву;
  • cd / – пеpейти в коpневой каталог;
  • cd ../local – веpнуться в pодительский каталог и пеpейти в его подкаталог local.
ls
Команда ls выдает pазличную инфоpмацию о файлах и каталогах (аналог команды DIR для DOS-систем). Как и большинство команд, ls имеет возможные аpгументы и параметры (флаги), котоpые позволяют изменить её действие.
Пеpейдите с помощью команды cd / в коpневой каталог и посмотpите его содеpжимое. Если опции не указаны, команда выводит отсоpтиpованные по алфавиту имена файлов и каталогов.
    user@desktop / $ ls
    bin/   dev/  home/  mnt/  proc/  sbin/  tmp/  var/
    boot/  etc/  lib/   opt/  root/  sys/   usr/
К сожалению, пока не очень понятно, что является каталогом, а что файлом. Помочь в этом может следующая команда, котоpая выдает инфоpмацию в pасшиpенном фоpмате, котоpый содеpжит больший объем инфоpмации о каждом файле (пpава доступа, pазмеp, дата последней модификации и т.д.):
    user@desktop / $ ls -l
    итого 19
    drwxr-xr-x   2 root root  3640 Окт 10 10:14 bin/
    drwxr-xr-x   3 root root   432 Сен  7 01:09 boot/
    drwxr-xr-x  16 root root 13360 Окт 11 18:24 dev/
    drwxr-xr-x  61 root root  3976 Окт 11 18:24 etc/
    drwxr-xr-x   6 root root   168 Авг 17 17:04 home/
    drwxr-xr-x  10 root root  4688 Окт  8 20:40 lib/
    drwxr-xr-x   8 root root   216 Авг 24 12:56 mnt/
    drwxr-xr-x   5 root root   144 Июн 10 10:15 opt/
    dr-xr-xr-x  96 root root     0 Окт 11  2005 proc/
    drwx------  10 root root   432 Окт 11 00:38 root/
    drwxr-xr-x   2 root root  4200 Окт 10 10:14 sbin/
    drwxr-xr-x  10 root root     0 Окт 11  2005 sys/
    drwxrwxrwt  18 root root  2608 Окт 11 21:27 tmp/
    drwxr-xr-x  15 root root   520 Авг 28 14:36 usr/
    drwxr-xr-x  13 root root   360 Июн  4 20:37 var/
Столбцы слева направо: тип файла и права доступа, число жестких ссылок, имя владельца, группа владельца, размер в байтах, время модификации, имя.
Если в качестве аргумента указать имя файла, то ls выдаст информацию только об этом файле:
    user@desktop / $ ls -l bin/ls
    -rwxr-xr-x  1 root root 78212 Окт  8 20:56 bin/ls*
Если в качестве аргумента указать имя каталога, то будет выдано содеpжимое этого каталога, т.е. имена файлов в этом каталоге:
    user@desktop / $ ls -l bin
    итого 7175
    -rwxr-xr-x  1 root root    3260 Окт 10 10:14 arch*
    lrwxrwxrwx  1 root root      10 Сен  7 00:29 awk -> gawk-3.1.5*
    -rwxr-xr-x  1 root root   14928 Окт  8 20:56 basename*
    -rwxr-xr-x  1 root root  718312 Июл 10 21:36 bash*
Если не указаны какие-либо опеpанды, будет выдано содеpжимое текущего каталога. В случае, если указано несколько опеpандов, сначала выводится инфоpмация о файлах, а потом о каталогах. Вывод пpоисходит в алфавитном поpядке.
Можно использовать следующие опции:
-C
Вывод содеpжимого каталога в несколько столбцов. Пpинимается по умолчанию пpи выводе на теpминал.
-F
Добавить «слэш» (/) к имени каталога, звездочку (*) к имени исполнимого файла, знак (@) к каждой символической ссылке.
-R
Рекуpсивный обход встpетившихся подкаталогов. Может быть полезна для создания списка всех файлов системы.
-c
Вывод соpтиpуется по вpемени последней модификации файла.
-d
Вывод только имени каталога (но не содеpжимого).
        user@desktop / $ ls -ld bin
        drwxr-xr-x  2 root root 3640 Окт 10 10:14 bin/
-f
Вывод не сортируется, т.е. поpядок вывода соответствует поpядку файлов в каталоге.
        user@desktop / $ ls -f
        ./   bin/  etc/  mnt/  tmp/  var/  boot/  proc/  root/
        ../  dev/  lib/  opt/  sys/  usr/  home/  sbin/
-i
Для каждого файла выводится номер индексного дескpиптоpа (уникальный номеp файла).
        user@desktop / $ ls -f
           2797 bin/   4816541 etc/      3306 mnt/   4843384 root/  4816986 tmp/
        4843263 boot/     3299 home/  4816984 opt/   4843270 sbin/      351 usr/
           1301 dev/   4816821 lib/         1 proc/        1 sys/   4816990 var/
-r
Изменение поpядка соpтиpовки на обpатный (по алфавиту или по вpемени последнего использования).
-t
Сортиpовать по вpемени последней модификации файла (последний модифициpованный выводится пеpвым).
-1
Вывод одного имени на каждой стpоке. Пpинимается по умолчанию пpи выводе не на терминал.
mkdir
В пpоцессе освоения системы Вам необходимо будет создать свою собственную стpуктуpу каталогов. После установки системы, каталогов в ней довольно немного и в них пока еще тpудно затеpяться начинающему пользователю. В пpоцессе pасшиpения файловой системы вам пpидется постоянно создавать новые и уничтожать стаpые каталоги, поэтому pассмотpим, как это все можно сделать.
Создать каталог довольно легко. Для этого существует команда mkdir (аналог её есть и в DOS системах). В качестве аргумента необходимо указать имя создаваемого каталога:
    mkdir [-p] имя_каталога

    user@desktop / $ cd
    user@desktop ~ $ mkdir test
    user@desktop ~ $ ls
    test/
Стандартные элементы точка (.) для самого каталога и две точки (..) для его родительского каталога создаются автоматически.
Команда mkdir может быть использована и для создания нижележащих подкаталогов непосpедственно из текущего каталога с указанием полного пути к ним. В этом случае все указанные в пути каталоги должны существовать и быть доступны. Если же Вам необходимо создать иерархию каталогов, удобно пользоваться опцией -p:
    user@desktop ~ $ mkdir -p test/xxx/yyy/zzz
    user@desktop ~ $ ls -R test
    test:
    xxx/

    test/xxx:
    yyy/

    test/xxx/yyy:
    zzz/

    test/xxx/yyy/zzz:
Без использования опции -p при попытке создать уже существующий каталог будет выдано соответствующее предупреждение.
rmdir
После создания pазнообpазнейших каталогов, чеpез некотоpое вpемя у вас возникнет естественное желание удалить некотоpые из них. В этом вам может помочь команда rmdir. Ее фоpмат также пpост, как и фоpмат пpедыдущей команды mkdir:
rmdir имя_каталога
Команда rmdir удаляет каталог, имя котоpого указано в качестве параметра. Удаляемый каталог должен быть пустым, то есть пеpед его уничтожением вы должны удалить все находящиеся в нем файлы. Пpактически это пpиходится делать очень pедко, так как с двумя этими пpоблемами успешно спpавляется команда rm, котоpая будет pассмотpена позже.
    user@desktop ~ $ rmdir test
    rmdir: `test/': Directory not empty
Указанные имена каталогов обрабатываются по поpядку. Пpи одновpеменном удалении каталога и его подкаталога, подкаталог должен быть удален pаньше.
touch
Команда touch только и делает, что меняет время последнего доступа к файлу. Замечательной особенностью этой команды является то, что с ёё помощью можно создавать новые пустые файлы – если в качестве аргумента передаётся имя несуществующего файла:
    user@desktop test $ ls
    xxx/
    user@desktop test $ touch file.test
    user@desktop test $ ls -l
    итого 0
    -rw-r--r--  1 user users  0 Окт 12 00:01 test.file
    drwxr-xr-x  3 user users 72 Окт 11 23:09 xxx/
rm
В пpоцессе pаботы с системой довольно часто возникает необходимость удаления файлов. Для этого существует команда rm, котоpая позволяет удалять как файлы, так и каталоги. Пользоваться ей нужно с большой остоpожностью, так как UNIX-системы не имеют пpивычки, в отличии от Windows, пеpеспpашивать пользователя пеpед удалением файла, а делают это быстpо и навсегда. Поэтому, в связи с тем, что в UNIX-системах нет пpивычных пpогpамм восстановления удаленных файлов, крепко подумайте пеpед тем, как что-то удалять.
Команда rm имеет следующий фоpмат:
rm [-f | -i ] [-dRr ] имя_файла ...
С помощью данной команды вы можете удалить файлы, имена котоpых указаны в качестве паpаметpов. Если файл защищен от записи и стандартным устройством ввода данных является терминал, пользователю будет выдан запpос на подтвеpждение удаления файла.
Пpи попытке удаления каталога с помощью этой команды будет выдано сообщение об ошибке.
Вы можете использовать следующие опции:
-d
Если удаляемый файл окажется каталогом, то также его удалить.
-f
Удалить защищенный от записи файл без подтвеpждения. Если данный файл не существует, то не выводить сообщение об его отсутствии. Опция -f отменяет следующую опцию -i.
-i
Запpашивать подтверждение на удаление любого файла, независимо от того, является ли теpминал стандаpтным устpойством ввода или нет. Опция -i отменяет предыдущую опцию -f.
-r
Удалить все файлы и подкаталоги данного каталога, а после этого удалить и сам каталог. Опция -R подразумевает опцию -d. Если также указана опция -i, то пользователю выдается запpос на подтвеpжение удаления файлов и каталогов.
cp
Программа копирует содержимое файла в файл с другим именем либо в другой каталог с сохранением существующего имени файла, также применяется для копирования каталогов с их содержимым. Программа имеет следующий формат:
cp [-ipr] имя_файла ... имя_файла_назначения
Вы можете использовать следующие опции:
-i
Пользователю выдается запpос на подтвеpжение при перезаписи существующих файлов и каталогов.
-p
Сохранять существующий режим доступа к файлу.
-r
Копирование каталога с его подкаталогами.
Копирование файла в текущую директорию с новым именем:
user@desktop ~ $ cp /etc/resolv.conf resolv
Копирование файла в текущую директорию с сохранением имени:
user@desktop ~ $ cp /var/log/apache/access_log
Копирование директории:
user@desktop ~ $ cp -r /etc/ppp /etc/ppp.old


mv
Переименование файла или перемещение одного либо нескольких файлов (или каталогов) в другой каталог. Формат команды:
mv [-i | -f] имя_файла ... имя_файла_назначения
При переносе в рамках одной файловой системы команда только меняет путевое имя файла, поэтому переименование и перенос идентичны по реализации.
Вы можете использовать следующие опции:
-f
Запрет запроса подтверждений при перезаписи существующих файлов.
-i
Пользователю выдается запpос на подтвеpжение при перезаписи существующих файлов и каталогов.
Пример использования команды для переноса файла в каталог:
user@desktop ~ $ mv text/user.html text/htmls/
ln
Эта команда создаёт ссылки на файлы как жёсткие, так и символические. Она имеет следующий формат (аналогичный команде mv по порядку аргументов):
ln [-s] имя_файла имя_файла_ссылки
Вы можете использовать следующие опции:
-f
Запрет запроса подтверждений при перезаписи существующих файлов (ссылок).
-s
Создание символической ссылки.
Примеры использования команды:
user@desktop ~ $ ln text/alex/linux.html working/linux-todo.html
Создание символической ссылки на директорию:
user@desktop ~ $ ln -s images/my/photos photos
du
Команда выводит размер пространства на диске, занятого каталогом (и всеми его подкаталогами), в блоках (по умолчанию, 1 блок составляет 512 байт). По умолчанию выводится информация о текущем каталоге.
Программа имеет следующие параметры:
-a
Выводить информацию не только о каталогах, но и о файлах.
-h
Вывод размера директории в «человеческом» формате: килобайтах, мегабайтах и т.п..
-s
Вывод только общего итога, без отображения промежуточной информации.
Пример выполнения программы:
    user@desktop ~ $ du -sh test
    925K    test
tar
Команда tar предназначена для архивации групп файлов и директории. Эта команда позволяет объединять группу файлов и директорий со всеми атрибутами в единый файл, который имеет расширение «.tar». Полученный файл затем с помощью той же команды tar. Команда tar имеет множество опций, мы же остановимся на следующем формате использования команды:
tar[-c | -x] [-z | -j] -f имя_tar_файла имена_файлов_и_каталогов
Опция -c соответствует созданию архива, -x – разворачивание архива.
Созданный архив можно также сжать с помощью архиваторов gzip или bzip2. Для этого применяются соответственно опции -z и -j.
Имя архива, который создаётся или разворачивается передаётся после параметра -f.
Рассмотрим примеры работы с этой программой:
Создание архива etc.tar.bz2 директории /etc с использованием сжатия bzip2:
          user@desktop test $ tar -cjf etc.tar.bz2 /etc
          user@desktop test $ ls
          etc.tar.bz2
Разворачивание архива etc.tar.bz2 в текущую директорию с использованием разсжатия bzip2:
          user@desktop test $ tar -xjf etc.tar.bz2
          user@desktop test $ ls
          etc/ etc.tar.bz2
find
При работе с файлами часто бывает необходимо найти что-нибудь. В UNIX для этого существует команда find. В общем виде эта команда имеет следующий формат:
find [где_искать] [условие_поиска] [действие]
Первый аргумент команды find – это имя директории, в которой производится поиск. По умолчанию, это текущая директория.
Далее указываются условия поиска, которые могут принимать следующие значения:
-name
Имя файла. В нём можно использовать шаблоны, но при этом необходимо заключить имя в двойные кавычки.
-type
Тип файла: f – обычный файл, d – директория, l – символическая ссылка и т.п..
-user
Имя владельца файла или его уникальный идентификатор (UID).
-group
Имя группы владельца файла или её уникальный идентификатор (GID).
-perm
Права доступа файла.
-size
Размер файла. Обычно за числом следует буква – в чём измеряется размер (в блоках, байтах, килобайтах и т.п.).
-atime
Время доступа к файлу.
-ctime
Время последнего изменения владельца файла.
-mtime
Время последнего изменения содержимого файла.
-newer
Поиск всех файлов новее указанного.
Условия поиска могут быть объединены с помощью модификаторов: -a – И, -o – ИЛИ, \! – НЕ, \(...\) – группа условий.
К найденым файлам могут применяться следующие действия:
-print
Вывести на экран имя найденного файла вместе с путём. Это действие выполняется по умолчанию.
-delete
Удалить найденные файлы.
-exec команда {} \;
Исполнение указанной команды для каждого найденного файла с передачей имени файла в качестве артумента ({}).
-ok команда {} \;
Аналогична действию -exec, только для каждого файла запрашивается подтверждение перед выполнением команды.
Рассмотрим примеры использования команды:
Вывод всех файлов в текущей директории и поддиректориях:
          user@desktop test $ find
          .
          ./xxx
          ./xxx/yyy
          ./xxx/yyy/zzz
          ./test.file
Вывод всех файлов в директории /etc, начинающихся на «re»:
          user@desktop test $ find /etc -name "re*"
          /etc/apm/resume.d
          /etc/ppp/resolv.conf
          /etc/pam.d/rexec
          /etc/ssmtp/revaliases
          /etc/conf.d/reslisa
          /etc/init.d/reslisa
          /etc/init.d/reboot.sh
          /etc/resolv.conf
Вывод всех поддиректорий в директории /etc, начинающихся на «re»:
          user@desktop test $ find /etc -name "re*" -a -type d
          /etc/apm/resume.d
Вывод всех файлов в директории /etc, изменённых за последние сутки:
          user@desktop test $ find /etc -mtime -1
          /etc
          /etc/mtab
          /etc/env.d/01hostname
          /etc/adjtime
Вывод всех файлов в директории /tmp, не принадлежащих пользователю user:
          user@desktop test $ find /tmp \! -user user
          /tmp/.X11-unix
          /tmp/.X11-unix/X0
          /tmp/mc-root
Удаление в текущей директории всех устаревших файлов (оканчивающихся на «~»:
          user@desktop test $ find -name "*~" -delete
Вывод на экран имён всех текстовых файлов в домашней директории:
          user@desktop test $ find ~ -name "*.txt" -exec echo {} \;
          /home/user/a.txt
          /home/user/unix_commands.txt
Копирование всех текстовых файлов на дискету:
          user@desktop test $ find ~ -name "*.txt" -exec cp {} /mnt/floppy/ \;
mkfifo
Команда используется для создания специальных файлов - именованных каналов. С помощью этих каналов можно осуществлять взаимодействие между процессами операционной системы.
Для создания канала необходимо ввести команду mkfifo, аргументом которой является имя файла канала:
user@desktop test $ mkfifo pipe
Именованый канал аналогичен неименованному (который устанавливается с помощью символа «|») – процессы могут писать в него и читать из него. При этом с каналом оперируют как с файлом:
    user@desktop test $ echo "Hello, world." > pipe
    user@desktop test $ cat < pipe
    Hello, world.
Каналы, в отличие от файлов, только передают, но не сохраняют информацию. Например, последующее чтение канала приведёт к приостановке просматривающего процесса: пока не поступят новые данные.

Команды по работе с текстом[править]

В операционной системе UNIX большинство информации хранится в текстовом виде. Поэтому команды по обработке текстовой информации играют очень важную роль в этой операционной системе.

echo
Познакомимся еще с одной командой, аналог котоpой имеется в DOS-системах. Это команда echo (эхо).
Она имеет фоpмат:
echo [-n] [arg ...]
Команда echo выводит на устройство стандартного вывода заданные ей аргументы, разделяя их пробелами и завершая их символом новой строки (\n).
Эта команда удобна для формирования диагностических сообщений в командных файлах и для передачи известных данных в программном канале.
С помощью следующей команды можно довольно пpосто создать пустой файл: echo > имя_файла.
Возможен параметр -n – не выводить завеpшaющий символ перевода строки.
Интеpпpетатоp команд имеет встроенную команду echo, которая имеет синтаксические различия с внешней командой echo. Следует знать, что пользователям, работающим с оболочкой, будет доступна встроенная команда echo, если они не укажут /bin/echo.
Рассмотрим примеры использования этой команды:
Вывод сообщения «Error reading sector» на экpан:
          user@desktop test $ echo "Error reading sector"
          Error reading sector
          user@desktop test $
Вывод сообщения без завеpшающего символа новой стpоки:
          user@desktop test $ echo -n "Error reading sector"
          Error reading sectoruser@desktop test $
Вывод сообщения в файл file1:
user@desktop test $ echo "Error reading sector" > file1
Добавление сообщения к содеpжимому файла file1:
user@desktop test $ echo "Error reading sector" >> file1
Вывод имен файлов текущего каталога в алфавитном поpядке:
user@desktop test $ echo *
Вывод списка файлов с именами, соответствующих шаблону. Вывести имена файлов с pасшиpением .txt:
user@desktop test $ echo *.txt
cat
Рассмотpим еще одну команду, котоpая может быть полезна пpи pаботе с файлами. Это команда cat (аналог команды TYPE для DOS-систем).
Команда cat имеет следующий фоpмат:
cat [-benstuv] [-] [file1 [file2 ...]]
Она по очеpеди читает указанные, как аpгументы файлы и выводит их содеpжимое на стандаpтное устpойство вывода.
Поименованный файл или файлы выводятся последовательно один за дpугим без пpомежутков. Если файл достаточно длинный, то можно пpиостановить вывод с помощью комбинации клавиш Ctrl-S. Для пpодолжения вывода нажмите любую клавишу. Окончание ввода производится комбинацией Ctrl-D.
Операнды обрабатываются в порядке их pазмещения в командной строке. Если не указан ни один файл или указана опция (-), команда читает данные со стандаpтного устpойства ввода.
Вы можете использовать следующие опции:
-n
Нумеpовать стpоки начиная с 1.
-b
Подразумевает опцию -n, но не нумеpует пустые стpоки.
-e
Подразумевает опцию -v и отображает знак доллара ($) в конце каждой строки (визуализация символа пеpевода стpоки).
-s
Пpи наличии идущих подряд пустых строк выводить только одну.
-t
Подразумевает опцию -v. Выводит символы табуляции как ^I.
-u
Вывод не буферизуется, то есть символы из входного файла записываются в стандаpтный вывод без задержки, как только они были пpочитаны. По умолчанию вывод буфеpизуется, то есть символы могут накапливаться в пpомежуточном буфеpе.
-v
Отображение непечатных символов. Упpавляющие символы выводятся в виде ^X (CRTL+X), символ DEL (восьмеричное 0177) как ^?. Символы не входящие в стандаpтный ASCII-набоp (напpимеp, символы киppилицы с набоpом стаpших pазpядов) выводятся как «M-x», где x – опpеделяемый младшими семи битами символ.
Рассмотрим примеры использования команды:
Файл file выводится на устройство стандартного вывода:
user@desktop test $ cat file
Сцепление (слияние) файлов file1 и file2, после чего они помещаются в файл file3:
user@desktop test $ cat file1 file2 > file3
Пpисоединение файла file1 к концу файла file2:
user@desktop test $ cat file1 >> file2
Вывод содеpжимого файла с нумеpацией стpок, но без нумеpации пустых стpок:
          user@desktop test $ cat -b file1
          1  Number 1
          2  Number 2
          3  Number 3
          4  Number 4


          5  Number 5
Нумеpация всех стpок:
          user@desktop test $ cat -n file1
          1  Number 1
          2  Number 2
          3  Number 3
          4  Number 4
          5
          6
          7  Number 5
less
Команда less используется для просмотра файлов, размер которых превышает размер экрана. Пользователю предоставляется интерактивный интерфейс, в котором текст можно пролистывать, производить по нему поиск и т.п..
Имя просматриваемого файла необходимо указать в качестве аргумента программы:
user@desktop ~ $ less README.txt
Управлять программой less просто: страницы перелистываются пробелом, а когда читать надоест, надо нажать q (Quit). Перелистывать страницы можно и клавишами Page Up/Page Down, для сдвига на одну строку вперед можно применять Enter или стрелку вниз, а на одну строку назад – стрелку вверх. Переход на начало и конец текста выполняется по командам g и G соответственно (Go). Полный список того, что можно делать с текстом в less, выводится по команде h (help). Для поиска и подстветки интересующего понятия можно воспользоваться командой /, после которой необходимо ввести интересующий Вас термин – по нажатию клавиши Enter, курсор перейдёт к первому упоминанию термина, который будет выделен серым цветом. Последующие нажатия / и Enter приведут к продолжению поиска слова по документу.
Программа less используется в качестве основы команды man – при просмотре страниц руководств.
head
Команда выводит на экран первые несколько строк файла. По умолчанию выводится первые 10 строк. Имя выводимого файла указывается в качестве аргумента программы, и если оно не задано, производится чтение информации со стандартного входа.
С помощью параметра -n можно задать число строк от начала файлы, которые будут выведены на экран. Например:
    user@desktop ~ $ head -n 3 /etc/inittab
    #
    # /etc/inittab:  This file describes how the INIT process should set up
    #                the system in a certain run-level.
tail
Команда выводит на экран последние несколько строк файла. По умолчанию выводятся последние 10 строк. Имя выводимого файла указывается в качестве аргумента программы, и если оно не задано, производится чтение информации со стандартного входа.
С помощью параметра -n можно задать число строк от конца файла, которые будут выведены на экран. Например:
    user@desktop ~ $ tail -n 5 /var/log/emerge.log
    1130052968: Started emerge on: Oct 23, 2005 11:36:08
    1130052968:  *** emerge --fetchonly samba
    1130052969:  >>> emerge (1 of 1) net-fs/samba-3.0.20b to /
    1130052971:  *** Finished. Cleaning up...
    1130052971:  *** terminating.
Таким способом удобно просматривать последние записи системных журналов.
Другим важным параметром команды является -f: команда ожидает изменения в конце фала и отображает их на экране. Часто это используется при просмотре постоянно увеличивающихся файлов. Для завершения команды нажмите Ctrl-C.
cut
Команда позволяет выводить указанные столбцы или записи из одного или нескольких файлов. Столбцом называется именно столбец – символы с одной и той же позицией в строке, записи же разделяюся символами табуляции. И столбцы и записи задаются указанием их порядкового номера в строке.
Вы можете использовать следующие опции:
-c список
вывод столбцов, указанных агрументом список;
-f список
вывод полей, указанных агрументом список;
-d символ
устанавливает заданный символ в качестве разделителя полей при использовании параметра -f. Если в качестве разделителя используется небукверрый символ (например, пробел), он должен быть заключён в кавычки.
Примеры работы программы:
Выделение первых семи столбцов файла:
          user@desktop ~ $ cat phones.txt
          1234567                Борис Петрович
          5557845                Анна Иоановна
          ...
          user@desktop ~ $ cut -c1-7 phones.txt
          1234567
          5557845
          ...
Получение списка групп пользователей, зарегистрированных в системе:
          user@desktop ~ $ cut -f1 -d: /etc/group
          root
          bin
          daemon
          sys
          adm
          ...
paste
Команда paste объединяет два текстовых файла в один. В получившемся файле исходные строки располагаются в соседних столбцах, разделённые символом табуляции (или любым другим символом, указанным через параметр -d).
Часто применяется совместно с программой cut.
sort
Команда sort сортирует строки, входящие во все исходные файлы, и выдает результат на стандартный вывод. Если имена файлов не указаны, или в качестве файла указан «-», исходная информация поступает со стандартного ввода. Команда имеет формат:
sort [-c] [-r] [файл ...]
При упорядочении используется один или несколько ключей сортировки, выделяемых из каждой вводимой строки. По умолчанию ключ сортировки один – вся строка, а порядок является лексикографическим, соответствующим принятой кодировке символов.
Вот основные опции команды:
-c
Вместо сортировки файла проверяет, отсортирован ли он. Если файл не отсортирован, команда возвращает 1 и выводит соответствующее сообщение.
-r
Заменить результат сравнения на противоположный.
Рассмотрим примеры использования команды:
Отсортировать файл с фамилиями:
          user@desktop test $ cat f.txt
          Petrov
          Ivanov
          Sidorov
          Abramov
          user@desktop test $ sort f.txt
          Abramov
          Ivanov
          Petrov
          Sidorov
Отсортировать список файлов в обратном порядке:
          user@desktop test $ ls / | sort -r
          var/
          usr/
          tmp/
          sys/
          sbin/
          root/
          ...
uniq
Команда uniq построчно анализирует файл и в случее, если он содержит в себе повторяющиеся строки, выбрасывает дубликаты. Команда имеет следующий формат:
uniq [-c] [исходный_файл]
Если имя исходного файла не указано, команда читает данные со стандартного ввода.
В качестве параметра может быть указано -c, тогда рядом с каждой строкой будет выведено число повторений этой строки.
Рассмотрим примеры использования команды:
Получим имена всех пользователей, работающих в системе в настоящий момент:
          user@desktop test $ who | cut -f1 -d' '
          root
          root
          murie
          practica
          user@desktop test $ who | cut -f1 -d' ' | uniq
          root
          murie
          practica
Однако такой результат будет не всегда:
          user@desktop test $ who | cut -f1 -d' '
          root
          murie
          root
          practica
          user@desktop test $ who | cut -f1 -d' ' | uniq
          root
          murie
          root
          practica
Это происходит потому, что команда uniq сравнивает строки последовательно. Для того, чтобы избежать дублирования, результат можно сперва сортировать:
          user@desktop test $ who | cut -f1 -d' ' | sort | uniq
          murie
          practica
          root
iconv

Команда iconv не является оригинальной командой UNIX, она появилась в системах, разработанных в рамках проекта GNU. Однако большинство современных версий UNIX содержат эту команду.

Команда предназначена для перекодирования текстовых файлов из одной кодировки в другую и имеет следующий формат:
iconv [-l] -f исходная_кодировка -t конечная_кодировка [исходный_файл]
Если имя исходного файла не указано, команда читает данные со стандартного ввода.
Имя кодировки – исходной или конечной должно соответствовать кодировке в файле, список доступных кодировок можно получить, если запустить команду iconv с параметром -l.
wc
Эта команда предназначена для подсчёта количества строк, символов и слов в указанных файлах. Команда имеет слудующий формат:
wc [-clmw] file ...
Можно использовать следующие опции:
-c
Вывод только количества байт.
-l
Вывод только количества строк.
-m
Вывод только количества символов. Отличается от числа байт при многобайтной кодировке.
-w
Вывод только количества слов.
Рассмотрим примеры использования команды:
Подсчёт числа слов в документе:
          user@desktop test $ wc -w lectures.txt
          568 lectures.txt
Число файлов в директории:
          user@desktop test $ ls / | wc -l
          15
Полная статистика по группе xml-файлов (число строк, число слов, число байт):
          user@desktop test $ cat *.xml | wc 
             3978   16138  253680
dd
dd – команда блочного копирования файлов. Она имеет следующий формат:
dd if=исходный_файл of=конечный_файл bs=размер_блока count=число_блоков skip=число_блолов seek=число_блоков
Программа используется при копировании частей одного файла в другой, часто применяется при работе с устройствами. Рассмотрим параметры, принимаемые командой:
if=
Задаёт имя файла (или устройства), откуда будут копироваться данные.
of=
Задаёт имя файла (или устройства), куда будут копироваться данные.
bs=
Задаёт размер блока копирования в байтах. Можно применять модификаторы размера: «K» – килобайты, «M» – мегабайты и т.п.
count=
Задаёт число копируемых блоков. Если этот параметр не задан, копируется всеь исходный файл.
skip=
Число блоков в исходном файле, которое будет пропущено до чтения.
seek=
Число блоков в файле назначения, которое будет пропущено до записи.
Рассмотрим примеры использования команды:
Копирование загрузочного сектора жёсткого диска в файл bootsect:
          user@desktop test $ dd if=/dev/hda of=bootsect bs=512 count=1
          1+0 входных записей
          1+0 выходных записей
          512 bytes (512 B) copied, 9e-05 seconds, 5,7 MB/s
Копирование файла размером до двух мегабайт на простой гибкий диск и обратно:
          user@desktop test $ dd if=arch.tar.bz2 of=/dev/fd0 bs=1
          1788990+0 входных записей
          1788990+0 выходных записей
          user@desktop test $ dd if=/dev/fd0 of=arch2.tar.bz2 bs=1 count=1788990
          1788990+0 входных записей
          1788990+0 выходных записей

Команды, использующие регулярные выражения

grep
Часто пользователю нужно найти только упоминания чего-то конкретного в файле или среди данных, выводимых программой. Обычно эта задача сводится к поиску строк, в которых встречается определенное слово или комбинация символов. Для этого подходит стандартная утилита grep. grep может искать строку в файлах, а может работать как фильтр: получив строки со стандартного ввода, она выведет на стандартный вывод только те строки, где встретилось искомое сочетание символов.
Простой пример: найти своего пользователя в файле /etc/passwd:
    user@desktop ~ $ grep user /etc/passwd
    user:x:1000:100::/home/dralex:/bin/bash
Первый аргумент команды grep – та строка, которую нужно искать в файле или стандартном вводе, в данном случае это «user», а поскольку файл /etc/passwd выводит сведения по строке на каждого пользователя, таким образом можно получить информацию о пользвателе «user».
В случае, если нужно искать не конкретное сочетание символов, а какую-то их несложную комбинацию, используют регулярные выражения – способ специальной формулой задать все допустимые последовательности символов (в дискретной математике это понятие формулируется более строго).
В регулярном выражении большинство символов обозначают сами себя, как если бы мы искали обыкновенную текстовую строку, например, «user» и «::» в регулярном выражении соответствуют строкам «Note» и «::» в тексте. Однако некоторые символы обладают специальным значением, самый главный из таких символов – звездочка («*»), поставленная после элемента регулярного выражения, обозначает, что могут быть найдены тексты, где этот элемент повторен любое количество раз, в том числе и ни одного, т.е. просто отсутствует.
С помощью следующей команды можно посмотреть все локальные сетевые имена, зарегистрированные в системе:
    user@desktop ~ $ grep "^127.*" /etc/hosts
    127.0.0.1       localhost
Символ «.» означает «любой символ», а вместе с «*» означает 0 или более любых символов . Символ «^» в начале регулярного выражения означает, что необходимы строки, начинающиеся с данного шаблона (для обозначения конца строки используют символ «$»).
Существуют и другие способы группирования символов:
«[» и «]» задают класс символов, когда в выражении может встретиться любой из них. С помощью следующего регулярного выражения выводятся все строки, содержащие любые числа (знак «+» является аналогом «*», только задаёю 1 и большее число упоминаний предыдущего символа):
          user@desktop ~ $ grep "[0-9]\+" /etc/hosts
          # Copyright 1999-2002 Gentoo Technologies, Inc.
          # Distributed under the terms of the GNU General Public License, v2 or later
          # $Header: /home/cvs/doc-admin/shell.xml,v 1.19 2006/02/07 21:46:15 dralex Exp $
          127.0.0.1       localhost
«(» и «)» позволяют группировать выражения. Например, следующая команда выводит все строки, содержащие IP-адрес:
          user@desktop ~ $ grep "\([0-9]\+\.\)\{3\}[0-9]\+" /etc/hosts
          127.0.0.1       localhost
Запись «{3}» означает, что предыдущий символ или выражение должно повторяться в точности 3 раза.
Регулярные выражения содержат множество управляющих символов, каждый их которых наделён собственным смыслом. Для того, чтобы воспользоваться непосредственным значением символа (для поиска его в строке), необходимо поставить перед ним символ обратной косой: «\».
Команда grep содержит множество удобных параметров, например вывод номера найденной строки (-n) или вывод только подстроки, соответствующей самому регулярному выражению (-o).
Благодаря регулярным выражениям можно автоматизировать очень многие задачи, которые в противном случае потребовали бы огромной и кропотливой работы человека. Более подробные сведения о возможностях языка регулярных выражений можно получить из руководства команды grep.
sed
Регулярные выражения можно использовать не только для поиска по файлу, но и для изменения информации. Для такого поиска с заменой можно воспользоватья утилитой sed (stream editor – поточный редактор). sed имеет свой встроенный простой язык, с помощью которого можно задать правила модифицирования файла.
Все команды встроенного языка sed состоят из одной буквы. Например, поиск с заменой выполняет команда «s» (search). Синтаксис у нее следующий:
s/что_искать/на_что_заменять/
Например:
          user@desktop ~ $ ls -l / | sed 's/^d[^ ]\+/directory/'
          итого 20
          directory   2 root root  3640 Окт 17 09:12 bin/
          directory   3 root root   472 Окт 17 12:27 boot/
          directory  16 root root 13360 Окт 24 13:18 dev/
          directory  61 root root  4040 Окт 24 13:18 etc/
          ...
Эта команда заменяет в информации о корневой директории все строки, начинающиеся с символа d и все, следующие за ним непробельные символы, на слово directory.
Кроме команды поиска, sed имеет команды удаления, копирования и замены строк. Также команды могут иметь модификаторы, например, символ «g» в конце команды поиска указывает делять замену для всех найденных по регулярному шаблону подстрок, а не только для первого.
Попробуем разобраться подробнее, как работает редактор sed. Входной текст sed считывает построчно. К считанной строке он по очереди пробует применить каждую команду сценария. Применив все возможные команды к строке, sed выводит на стандартный вывод то, что от нее осталось. Команда сценария может начинаться с т.н. контекстного адреса, определяющего свойства строк, к которым эту команду можно применять. Простой контекстный адрес – это номер строки (команда применяется к единственной – совпадающей по номеру – строке входного потока) или регулярное выражение (команда применяется ко всем строкам, в которых найдено соответствие этому РВ). Например, команда sed "1s/_/ /g" заменит в первой строке все подчеркивания на пробелы, а sed "/^a/d" удалит (delete) все строки, начинающиеся с «a».
У sed очень широкие возможности, но довольно непривычный синтаксис. Чтобы в нем разобраться, нужно обязательно прочесть руководство sed и знать регулярные выражения. Также по утилите sed есть отдельный учебник.

Резюме[править]

В данном разделе рассматриваются основные команды по работе с файловой системой и текстами, а также примеры их комплексного использования.

Ключевые термины:pwd, cd, ls, mkdir, rmdir, touch, rm, cp, mv, ln, du, tar, find, mkfifo, echo, cat, less, head, tail, cut, paste, sort, uniq, iconv, wc, dd, grep, регулярное выражение, sed

Дополнительные материалы[править]

  1. Курячий Г.В., Маслинский К.А. Операционная система Linux. – М.: Интуит.Ру, 2005. – 392 с.: ил.
  2. Курячий Г.В. Операционная система UNIX. – М.: Интуит.Ру, 2004. – 292 с.: ил.
  3. Рейчардс К., Фостер-Джонсон Э. UNIX: справочник. – СПб.: Питер Ком, 1999. – 384 с.: ил.

Практическое занятие. Работа с файлами в UNIX[править]

Цель занятия: знакомство с командной строкой UNIX, командами по работе с файловой системой и командами обработки текстовых файлов.

Изучаемые команды: cat, cd, cp, cut, echo, find, grep, head, ln, ls, mkdir, mv, paste, pwd, sort, tail, tar, touch, uniq, wc

Сценарий: Знакомство с каталогами UNIX[править]

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

Начальные условия: Командная строка после входа в систему.

1. Получить имя текущего каталога с помощью команды pwd:

      user@desktop ~ $ pwd
      /home/user/

2. Перейти в корневой каталог с помощью команды cd /:

      user@desktop ~ $ cd /
      user@desktop / $ pwd
      /

Отметить, как изменилось строка приглашения.

3. Посмотреть содержимое корневого каталога с помощью команды ls:

      user@desktop / $ ls
      bin   dev  home  mnt  proc  sbin  tmp  var
      boot  etc  lib   opt  root  sys   usr

4. Сравнить с использованием «раскарашенного» вывода команды ls -F --color:

      user@desktop / $ ls -F --color
      bin/   dev/  home/  mnt/  proc/  sbin/  tmp/  var/
      boot/  etc/  lib/   opt/  root/  sys/   usr/

Диретории отмечаются синим цветом и знаком «/» после имени.

5. Посмотреть содержимое домашнего каталога с помощью команды ls -F --color ~:

      user@desktop / $ ls -F --color ~
      user@desktop / $

Возможно, домашний каталог пуст.

6. Вернуться в домашний каталог с помощью cd без параметров:

      user@desktop / $ cd
      user@desktop ~ $

7. Создать директорию test с помощью команды mkdir test:

user@desktop ~ $ mkdir test

8. Посмотреть обновлённое содержимое домашнего каталога ls -F --color:

      user@desktop ~ $ ls -F --color
      test/

9. Создать поддиректорию subtest в директории test командой mkdir test/subtest:

user@desktop ~ $ mkdir test/subtest

10. Посмотреть содержимое домашнего каталога и его подкаталогов с помощью ключа рекурсивного просмотра -R в команде ls -F --color -R:

      user@desktop ~ $ ls -F --color -R
      .:
      test/
      test:
      subtest/

      test/subtest:

Сценарий: Изучение типов файлов в UNIX[править]

В этом сценарии рассматриваются типы файлов в UNIX: простые файлы, директории, ссылки. Изучаются команды создания и копирования файлов. Показывается разница между жесткими и символическими ссылками, между копированием и переносом файла.

Начальные условия: Командная строка. Директория test после предыдущего сценария.

1. Cоздать пустой файл с помощью команды touch test/first.txt:

      user@desktop ~ $ touch test/first.txt
      user@desktop ~ $ ls -F --color test/                
      first.txt  subtest/

2. Добавить строку текста в конец файла с помощью команды echo "Hello, world" >> test/first.txt и перенаправления вывода:

user@desktop ~ $ echo "Hello, world" >> test/first.txt

3. Посмотреть содержимое файла с помощью команды cat test/first.txt:

      user@desktop ~ $ cat test/first.txt
      Hello, world
      user@desktop ~ $

4. Посмотреть расширенную информацию о каталоге, используя ключ -l команды ls. ls -F --color -l test:

      user@desktop ~ $ ls -F --color -l test
      итого 4
      -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
      drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/

5. Добавить псевдоним командной оболочки, чтобы сократить размер команды, с помощью команды alias ls='ls -F --color -l':

      user@desktop ~ $ alias ls='ls -F --color -l'
      user@desktop ~ $ ls test
      итого 4
      -rw-r--r--  1 user users 13 Окт 15 20:48 first.txt
      drwxr-xr-x  2 user users 48 Окт 13 21:33 subtest/

6. Посмотреть глубже на директорию test, используя ключи -a и -i. ls -a -i test

      user@desktop ~ $ ls -a -i test
      итого 7
      drwxr-xr-x   3 user users  104 Окт 15 20:49 ./
      drwx------  67 user users 3352 Окт 15 20:42 ../
      -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
      drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

Первый столбец – номера индексных узлов файловой системы. Третий столбец – число жёстких ссылок файла.

7. Перейти в каталог test с помощью команды cd test

user@desktop ~ $ cd test

8. Скопировать файл с помощью команды cp first.txt copy1.txt:

      user@desktop test $ cp first.txt copy1.txt
      user@desktop test $ ls -a -i 
      итого 11
      5522107 drwxr-xr-x   3 user users  136 Окт 15 20:54 ./
      384269 drwx------  67 user users 3352 Окт 15 20:42 ../
      5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
      5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 first.txt
      6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

Новый файл имеет свой собственный индексный узел.

9. Переименовать файл с помощью команды mv first.txt orig.txt. mv first.txt orig.txt:

      user@desktop test $ mv first.txt orig.txt
      user@desktop test $ ls -a -i
      итого 11
      5522107 drwxr-xr-x   3 user users  128 Окт 15 20:59 ./
      384269 drwx------  67 user users 3352 Окт 15 20:42 ../
      5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
      5937954 -rw-r--r--   1 user users   13 Окт 15 20:48 orig.txt
      6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

Отметим, что изменилось только имя файла, все остальные атрибуты остались прежними.

10. Создать жёсткую ссылку командой ln orig.txt copy2.txt:

      user@desktop test $ ln orig.txt copy2.txt
      user@desktop test $ ls -a -i
      итого 15
      5522107 drwxr-xr-x   3 user users  160 Окт 15 21:00 ./
      384269 drwx------  67 user users 3352 Окт 15 20:42 ../
      5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
      5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
      5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
      6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

Добавилась ещё одна ссылка на тот же файл, число ссылок увеличилось на 1.

11. Создать символическую ссылку командой ln -s orig.txt orig.lnk:

      user@desktop test $ ln -s orig.txt orig.lnk
      user@desktop test $ ls -a -i
      итого 15
      5522107 drwxr-xr-x   3 user users  184 Окт 15 21:18 ./
      384269 drwx------  67 user users 3352 Окт 15 21:02 ../
      5938127 -rw-r--r--   1 user users   13 Окт 15 20:54 copy1.txt
      5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 copy2.txt
      5938189 lrwxrwxrwx   1 user users    8 Окт 15 21:18 orig.lnk -> orig.txt
      5937954 -rw-r--r--   2 user users   13 Окт 15 20:48 orig.txt
      6292625 drwxr-xr-x   2 user users   48 Окт 13 21:33 subtest/

Новый файл имеет новый индексный узел и размер, равный имени файла orig.txt.

12. Сравним содержимое файлов при обращении к ним по имени:

      user@desktop test $ cat orig.txt
      Hello, world
      user@desktop test $ cat copy2.txt
      Hello, world
      user@desktop test $ cat orig.lnk
      Hello, world

К одним и тем же данным можно обратиться через жесткую или символическую ссылку.

Сценарий: Поиск системных журналов[править]

В этом сценарии изучается команда поиска файлов и директорий.

Начальные условия: Командная строка, директория test после прошлого сценария.

1. Перейти в каталог test с помощью команды cd test:

user@desktop ~ $ cd test

2. Вывести список всех файлов и директорий в текущей директории, включая содержимое поддиректорий с помощью команды find:

      user@desktop ~ $ find
      .
      ./orig.lnk
      ./orig.txt
      ./subtest
      ./copy1.txt
      ./copy2.txt

3. Найти все файлы и директории в текущей директории и ее поддиректориях, которые начиняются на «o» с помощью команды find -name "o*":

      user@desktop ~ $ find -name "o*"
      ./orig.lnk
      ./orig.txt

4. Найти все файлы и дериктории в директории /etc и ее поддиректориях, которые начиняются на «o» с помощью команды find /etc -name "o*":

      user@desktop ~ $ find /etc -name "o*"
      /etc/apm/other.d
      /etc/joe/syntax/ocaml.jsf
      /etc/opt
      /etc/ppp/options-pptp
      /etc/ppp/options-pppoe
      /etc/ppp/options
      /etc/ssl/openssl.cnf
      /etc/dpkg/origins
      /etc/pam.d/other
      /etc/texmf/tex/plain/config/omega.ini

5. Найти все обычные файлы в директории /etc и ее поддиректориях, которые начинаются на «o» с помощью команды find /etc -name "o*" -a -type f:

      user@desktop ~ $ find /etc -name "o*" -a -type f
      /etc/joe/syntax/ocaml.jsf
      /etc/ppp/options-pptp
      /etc/ppp/options-pppoe
      /etc/ppp/options
      /etc/ssl/openssl.cnf
      /etc/pam.d/other
      /etc/texmf/tex/plain/config/omega.ini

6. Найти все обычные файлы в директории /var/ и ее поддиректориях, заканчивающиеся на «log»:

      user@desktop ~ $ find /var -name "*log" -a -type f
      find: /var/lib/mysql: Permission denied
      find: /var/lib/samba/private: Permission denied
      ...
      /var/log/emerge.log
      /var/log/lastlog
      /var/log/faillog
      /var/log/Xorg.0.log

Список найденных файлов может быть слишком большим и для его просмотра можно воспользоваться «прокруткой» терминала с помощью клавиш Shift-PgUp и Shift-PgDn 7. Исключить вывод сообщений об ошибках (например, «Permission denied») с помощью перенаправления вывода ошибок в специальное устройство /dev/null. Для этого ввести команду find /var -name "*log" -a -type f 2>/dev/null

      user@desktop ~ $ find /var -name "*log" -a -type f  2>/dev/null
      /var/log/emerge.log
      /var/log/lastlog
      /var/log/faillog
      /var/log/Xorg.0.log

8. Создать директорию logs с помощью команды mkdir test/logs:

user@desktop ~ $ mkdir test/logs

9. Скопировать найденные файлы в локальную директорию с помощью параметра -exec команды find. Для этого ввести команду find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/null:

      user@desktop ~ $ find /var -name "*log" -a -type f -exec cp {} test/logs/ \; 2>/dev/null
      user@desktop ~ $ ls -al test/logs
      итого 789
      -rw-r-----  1 user users 601033 Окт 16 18:37 emerge.log
      -rw-r--r--  1 user users 292292 Окт 16 18:37 lastlog
      -rw-r--r--  1 user users  37383 Окт 16 18:37 Xorg.0.log

Были скопированы все файлы, права на чтение которых у нас есть.

Сценарий: Архивирование и разархивирование файлов и директорий[править]

В этом сценарии изучается команда архивирования файлов и директорий. Командная строка, директория test после прошлого сценария.

Начальные условия:

1. Перейти в домашнюю директорию с помощью команды cd:

      user@desktop test $ cd
      user@desktop ~ $

2. Создать архив с именем test.tar.gz с применением сжатия, содержащий директорию test с помощью команды tar -czf test.tar.gz test:

      user@desktop ~ $ tar -czf test.tar.gz test
      user@desktop ~ $ ls
      drwxr-xr-x   4 user users   208 Окт 16 18:36 test/
      -rw-r--r--   1 user users 79173 Окт 16 18:49 test.tar.gz

3. Создать новую директорию для содержимого архива командой mkdir test2:

user@desktop ~ $ mkdir test2

4. Перейти в новую директорию с помощью команды cd test2:

user@desktop ~ $ cd test2

5. Развернуть содержимое архива в текущую директорию с помощью команды tar -xzf ../test.tar.gz:

user@desktop test2 $ tar -xzf ../test.tar.gz

6. Убедиться, что содержимое распакованного архива совпадает с оригинальной директорией. Ввести команду ls -l -F:

      user@desktop test2 $ ls -l -F
      итого 0
      drwxr-xr-x  4 user users 208 Окт 16 18:36 test/
      user@desktop test2 $ ls -l -F test
      итого 12
      -rw-r--r--  1 user users  13 Окт 15 20:54 copy1.txt
      -rw-r--r--  2 user users  13 Окт 15 20:48 copy2.txt
      drwxr-xr-x  2 user users 136 Окт 16 18:37 logs/
      lrwxrwxrwx  1 user users   8 Окт 16 18:54 orig.lnk -> orig.txt
      -rw-r--r--  2 user users  13 Окт 15 20:48 orig.txt
      drwxr-xr-x  2 user users  48 Окт 13 21:33 subtest/

Сценарий: Cоздание новых текстовых файлов[править]

В этом сценарии изучаются команды для создания и модифицирования текстовых файлов. Командная строка.

Начальные условия:

1. Ввести команду echo "One line":

      user@desktop test $ echo "One line"
      One line

Данная команда принимает строку в виде аргумента и выводит её на стандартный вывод.

2. Ввести ту же команду, но перенаправить вывод в файл second.txt с помощью «>». Ввести команду echo "One line" > second.txt:

user@desktop test $ echo "One line" > second.txt

3. Добавить в конец файла second.txt строку «A line» с помощью другого перенаправления echo "A line" >> second.txt:

user@desktop test $ echo "A line" >> second.txt

4. Вывести содержимое файла с помощью команды cat second.txt:

      user@desktop test $ cat second.txt
      One line
      A line

5. С помощью команды cat можно создавать многострочные файлы –, если переопределить вывод программы в файл и вводить текст до нажатия Ctrl-D (конец ввода). Ввести команду cat >multiline.txt и набрать текст

      user@desktop test $ cat >multiline.txt
      Simple text:
      blah-blah-blah
      1 2 3 4 5 6 7 8 9 0

      bye!

      (Ctrl+D)
      user@desktop test $

6. Убедиться, что содержимое файла совпадает с введённым текстом, включая все переводы строки. Для этого ввести команду cat multiline.txt

      user@desktop test $ cat multiline.txt
      Simple text:
      blah-blah-blah
      1 2 3 4 5 6 7 8 9 0

      bye!

7. Основным назначением команды cat является объединение файлов, имена которых передаются как аргументы командной строки. Объединить файлы с помощью команды cat orig.txt second.txt multiline.txt > big.txt:

user@desktop test $ cat orig.txt second.txt multiline.txt > big.txt

8. Убедиться, что новый файл содержит строки из перечисленных файлов с помощью команды cat big.txt:

      user@desktop test $ cat big.txt
      Hello, world
      One line
      A line
      Simple text:
      blah-blah-blah
      1 2 3 4 5 6 7 8 9 0

      bye!

Сценарий: Разрезание и склеивание файлов[править]

В данном сценарии изучается, как выделять информацию, разбитую на части с помощью специального символа-разделителя (например, прообела или символа :), из файлов и создавать новые структурированные файлы.

Начальные условия: Командная строка.

1. Посмотреть содержимое файла /etc/passwd, в котором содержится информация о пользователях системы, с помощью команды cat /etc/passwd:

      user@desktop test $ cat /etc/passwd
      root:x:0:0:root:/root:/bin/bash
      bin:x:1:1:bin:/bin:/bin/false
      daemon:x:2:2:daemon:/sbin:/bin/false
      adm:x:3:4:adm:/var/adm:/bin/false
      lp:x:4:7:lp:/var/spool/lpd:/bin/false
      sync:x:5:0:sync:/sbin:/bin/sync
      shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
      ...

Каждая строка хранит запись об отдельном пользователе. Запись состоит из полей, разделённых символом «:».

2. Выделить первый столбец в каждой записи, установив разделитель в «:», с потощью команды cat /etc/passwd | cut -f1 -d::

      user@desktop test $ cat /etc/passwd | cut -f1 -d:
      root
      bin
      daemon
      adm
      lp
      sync
      shutdown
      ...

3. Отсортировать список пользователей по алфавиту с помощью команды cat /etc/passwd | cut -f1 -d: | sort:

      user@desktop test $ cat /etc/passwd | cut -f1 -d: | sort
      adm
      alias
      apache
      at
      bin
      cron
      cyrus
      ...

4. Выделить седьмой столбец в каждой записи, соответствующий командной оболочке пользователя, с помощью команды cat /etc/passwd | cut -f7 -d:

      user@desktop test $ cat /etc/passwd | cut -f7 -d:
      /bin/bash
      /bin/false
      /bin/false
      /bin/false
      /bin/false
      /bin/sync
      ...

Список содержит много повторяющихся строк.

5. Удалить повторяющиеся строки командой cat /etc/passwd | cut -f7 -d: | uniq:

      user@desktop test $ cat /etc/passwd | cut -f7 -d: | uniq
      /bin/bash
      /bin/false
      /bin/sync
      /sbin/shutdown
      /sbin/halt
      /bin/false
      ...

Некоторые повторяющиеся строки остались, так как сравниваются только последовательные строки.

6. Добиться полной уникальности, предварительно отсортировав строки с помощью команды sort. Ввести команду cat /etc/passwd | cut -f7 -d: | sort | uniq:

      user@desktop test $ cat /etc/passwd | cut -f7 -d: | sort | uniq
      /bin/bash
      /bin/false
      /bin/sync
      /dev/null
      /sbin/halt
      /sbin/shutdown

7. Выделить первый и седьмой столбец файла /etc/passwd в отдельные файлы. Для этого ввести команды cat /etc/passwd | cut -f1 -d: > users и cat /etc/passwd | cut -f7 -d: > shells:

      user@desktop test $ cat /etc/passwd | cut -f1 -d: > users
      user@desktop test $ cat /etc/passwd | cut -f7 -d: > shells

8. Объединить результаты с помощью команды paste users shells:

      user@desktop test $ paste users shells
      root    /bin/bash
      bin     /bin/false
      daemon  /bin/false
      adm     /bin/false
      lp      /bin/false
      sync    /bin/sync
      ...

Сценарий: Быстрый анализ текстов[править]

В данном сценарии изучаются команды, которые позволяют провести первичный анализ файла: с чего он начинается, как заканчивается и каков его размер.

Начальные условия: Командная строка.

1. Получить число строк в файле /etc/passwd с пломощью команды wc -l /etc/passwd :

      user@desktop test $ wc -l /etc/passwd
      44 /etc/passwd

2. Или другим способом: посчитав число слов в созданном ранее файле users с помощью команды cat users | wc -w:

      user@desktop test $ cat users | wc -w
      44

3. Посмотеть первые несколько строк длинного файла с помощью команды head logs/Xorg.0.log:

      user@desktop test $ head logs/Xorg.0.log
      X Window System Version 6.8.2
      Release Date: 9 February 2005
      X Protocol Version 11, Revision 0, Release 6.8.2
      Build Operating System: Linux 2.6.13-gentoo i686 [ELF]
      Current Operating System: Linux thinkpad 2.6.13-gentoo #1 Wed Sep 7 01:03:14 MSD 2005 i686
      Build Date: 08 October 2005
      Before reporting problems, check http://wiki.X.Org
      to make sure that you have the latest version.
      Module Loader present

4. Аналогично, посмотеть последние несколько строк с помощью команды tail logs/Xorg.0.log:

      user@desktop test $ tail logs/Xorg.0.log
      (II) RADEON(0): [RESUME] Attempting to re-init Radeon hardware.
      (II) RADEON(0): [agp] Mode 0x1f000201 [AGP 0x8086/0x3340; Card 0x1002/0x4c66]
      (II) Mouse1: ps2EnableDataReporting: succeeded
      SetClientVersion: 0 8
      SetGrabKeysState - disabled
      SetGrabKeysState - enabled
      (II) 3rd Button detected: disabling emulate3Button
      SetClientVersion: 0 8
      SetGrabKeysState - disabled
      SetGrabKeysState - enabled

Это бывает полезно при просмотре системных журналов – в них самые последние события содержатся в конце файлов.

Сценарий: Поиск строк по регулярным выражениям[править]

В данном сценарии рассматривается практическое использование регулярных выражений для поиска по текстовым файлам.

Начальные условия: Командная строка. Директория test/log с найденными системными журналами.

1. Среди найденных системных журналов посмотреть файл журнала загрузки графичской системы XFree86.0.log с помощью команды less test/log/XFree86.0.log:

user@desktop ~ $ less test/log/XFree86.0.log

Выйти из просмоторщика можно нажатием клавиши q.

2. Найти все предупреждения в журнале: строка, начинающаяся с «(WW)». Для этого ввести команду grep "^(WW)" test/log/XFree86.0.log:

      user@desktop ~ $ grep "^(WW)" test/log/XFree86.0.log
      (WW) The directory "/usr/share/fonts/freefonts/" does not exist.
      (WW) The directory "/usr/share/fonts/unifont/" does not exist.
      (WW) The directory "/usr/share/fonts/artwiz/" does not exist.
      ...

3. Получить все строки, содержащие следующий шаблон: последовательность из 1 или более цифры или буквы, затем символ собаки, затем еще одна последовательность 1 или более цифры или буквы или точки, затем символ точки, затем от двух до четырёх букв (имя домена первого уровня). Также служебный вывод ошибок удаляется (перенаправляется в нулевое устройство). Для этого ввести команду grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:

      user@desktop ~ $ grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
      /etc/devfsd.conf:# Richard Gooch  <rgooch@atnf.csiro.au>                3-JUL-2000
      /etc/inittab:# Author:  Miquel van Smoorenburg, <miquels@cistron.nl>
      /etc/inittab:# Modified by:  Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
      ...

При работе с несколькими файлами grep по умолчанию использует вывод имени файла перед найденной стокой.

4. Избавиться от имени файла в начале строки с помощью ключа -h. Ввести команду grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:

      user@desktop ~ $ grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
      # Richard Gooch  <rgooch@atnf.csiro.au>                3-JUL-2000
      # Author:  Miquel van Smoorenburg, <miquels@cistron.nl>
      # Modified by:  Patrick J. Volkerding, <volkerdi@ftp.cdrom.com>
      ...

5. Для вывода только найденной подстроки используется ключ -o. Ввести команду grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null:

      user@desktop ~ $ grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
      rgooch@atnf.csiro.au
      miquels@cistron.nl
      volkerdi@ftp.cdrom.com
      ...

6. Получить все файлы директории /etc/ с помощью команды find /etc -type f 2>/dev/null, игнорируя ошибки:

      user@desktop ~ $ find /etc -type f 2>/dev/null
      /etc/X11/xorg.conf.example
      /etc/X11/Sessions/kde-3.4
      /etc/X11/Sessions/Xsession
      /etc/X11/chooser.sh
      ...

7. Для каждого из найденных файлов произвести поиск подстроки «nameserver». Для этого ввести команду find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null:

      user@desktop ~ $ find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null
      # merge the new nameservers with the other options from the old ...
      grep --invert-match '^nameserver[[:space:]]' $REALRESOLVCONF
      nameserver 10.22.10.20
      ...

8. Для большего удобства добавить вывод имени файла (ключ -H) и номера строки (ключ -n), на которой было найдено совпадение, с помощью команды find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null:

      user@desktop ~ $ find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null
      /etc/ppp/ip-up:24:              # merge the new nameservers with the other optio...
      /etc/ppp/ip-up:26:                      grep --invert-match '^nameserver[[:space...
      /etc/ppp/resolv.conf:1:nameserver 10.22.10.20
      ...

Таким образом, команда grep может эффективно использоваться вместе с командой find для нахождения информации в файлах.

Задания для самоподготовки[править]

  1. Создайте каталог test1 в домашней директории. Сравните время создания системных каталогов /bin, /tmp с каталогом test1.
  2. Скопируйте файл /bin/ls в локальную директорию. Посмотрите атрибуты этого файла. Попробуйте запустить его.
  3. Создайте в локальной директории символическую ссылку tmplnk на директорию /tmp. Скопируйте несколько файлов в директрию tmplnk.
  4. Сравните файлы /dev/tty1 и /dev/hda1. Какой тип они имеют? Чем они отличаются?
  5. Найдите все файлы в системе, которые были модифицированы не более суток назад.
  6. С помощью одной команды найдите все файлы с расширением .html в директории /usr и скопируйте их в локальную папку htmls.
  7. Создайте архив директории /etc и узнайте его размер. Попробуйте создать сжатый архив той же папки. Сравните степень сжатия gzip и bzip2 на этом примере.
  8. Создайте текстовый файл a.txt из десяти строк. Узнайте его размер. Создайте новый файл, содержащий в себе файл a.txt четыре раза.
  9. С помощью одной команды найдите все файлы с расширением .txt в директории /usr и объедините их в один большой файл big.txt.
  10. Получите с помощью одной команды файл, содержащий все числовые идентификаторы пользователей, зарегистрированных в ситсеме.
  11. Получите с помощью одной команды строки с 5-ой по 8-ю в файле /proc/cpuinfo, содержащем информацию о процессоре.
  12. Придумайте регулярное выражение, соответствующее URL с использованием протокола http. Найдите все строки, содержащие такие URL в файлах директории /etc.
  13. С помощью одной команды найдите все файлы с расширениями .txt или .html в директории /usr, в которых содержится слово user.

Сценарии практического занятия на тему: Работа с файлами в UNIX[править]

«Сценарий: Знакомство с каталогами UNIX»

  1. pwd
    
  2. cd /
    
  3. ls
    
  4. ls -F --color
    
  5. ls -F --color ~
    
  6. cd
    
  7. mkdir test
    
  8. ls -F --color
    
  9. mkdir test/subtest
    
  10. ls -F --color -R
    

«Сценарий: Изучение типов файлов в UNIX»

  1. touch test/first.txt
    
  2. echo "Hello, world" >> test/first.txt
    
  3. cat test/first.txt
    
  4. ls
    
  5. ls -F --color -l test
    
  6. alias ls='ls -F --color -l'
    
  7. ls -a -i test
    
  8. cd test
    
  9. cp first.txt copy1.txt
    
  10. mv first.txt orig.txt
    
  11. mv first.txt orig.txt
    
  12. ln orig.txt copy2.txt
    
  13. ln -s orig.txt orig.lnk
    

«Сценарий: Поиск системных журналов»

  1. cd test
    
  2. find
    
  3. find -name "o*"
    
  4. find /etc -name "o*"
    
  5. find /etc -name "o*" -a -type f
    
  6. find /var -name "*log" -a -type f 2>/dev/null
    
  7. mkdir test/logs
    
  8. find /var -name "*log" -a -type f -exec cp {} test/logs/ 2>/dev/null
    

«Сценарий: Архивирование и деархивирование файлов и директорий»

  1. cd
    
  2. tar -czf test.tar.gz test
    
  3. mkdir test2
    
  4. cd test2
    
  5. tar -xzf ../test.tar.gz
    
  6. ls -l -F
    

«Сценарий: Cоздание новых текстовых файлов»

  1. echo "One line"
    
  2. echo "One line" > second.txt
    
  3. echo "A line" >> second.txt
    
  4. cat second.txt
    
  5. cat >multiline.txt
    
  6. cat multiline.txt
    
  7. cat orig.txt second.txt multiline.txt > big.txt
    
  8. cat big.txt
    

«Сценарий: Разрезание и склеивание файлов»

  1. cat /etc/passwd
    
  2. cat /etc/passwd | cut -f1 -d:
    
  3. cat /etc/passwd | cut -f1 -d: | sort
    
  4. cat /etc/passwd | cut -f7 -d:
    
  5. cat /etc/passwd | cut -f7 -d: | uniq
    
  6. cat /etc/passwd | cut -f7 -d: | sort | uniq
    
  7. cat /etc/passwd | cut -f1 -d: > users
    
  8. cat /etc/passwd | cut -f7 -d: > shells
    
  9. paste users shells
    

«Сценарий: Быстрый анализ текстов»

  1. wc -l /etc/passwd
    
  2. cat users | wc -w
    
  3. head logs/Xorg.0.log
    
  4. tail logs/Xorg.0.log
    

«Сценарий: Поиск строк по регулярным выражениям»

  1. less test/log/XFree86.0.log
    
  2. grep "^(WW)" test/log/XFree86.0.log
    
  3. grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
    
  4. grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
    
  5. grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
    
  6. find /etc -type f 2>/dev/null
    
  7. find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null
    
  8. find /etc -type f -exec grep -Hn "nameserver" {} \; 2>/dev/null
    

Методические указания по командам управления системой в UNIX[править]

Команды получения сведений о системе[править]

date
Программа позволяет посмотреть текущую дату и время в одном из множества форматов. Суперпользователь также может использовать эту программу для установки текущей даты и времени.
По умолчанию программа выводит время в формате заданной временной зоны. Для получения времени по Гринвичу используется параметр -u.
При выводе даты и времени используется формат вывода, принятый для данной страны и задаваемый переменными окружения LC_TIME и т.п..
Рассмотрим примеры использования команды:
Текущее время:
          user@desktop test $ date
          Срд Окт 19 08:21:38 MSD 2005
Текущее время по Гринвичу:
          user@desktop test $ date -u
          Срд Окт 19 04:21:39 UTC 2005
cal
Команда предназначена для вывода календаря на месяц или на год. По умолчанию, выводит календарь текущего месяца.
В качестве параметра можно указать год или месяц и год. Обратим внимание, что команда cal 05 выведет календарь на 5-й год, а не на 2005-й.
При выводе календаря используется формат вывода, принятый для данной страны и задаваемый переменными окружения LC_TIME и т.п..
Рассмотрим примеры использования команды:
Календарь на текущий месяц
          user@desktop test $ cal
              Октября 2005
          Вс Пн Вт Ср Чт Пт Сб
                             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
Календарь на 2005 год.
          user@desktop test $ cal 2005
                                         2005

                 Января                 Февраля                 Марта
          Вс Пн Вт Ср Чт Пт Сб   Вс Пн Вт Ср Чт Пт Сб   Вс Пн Вт Ср Чт Пт Сб
                             1          1  2  3  4  5          1  2  3  4  5
           2  3  4  5  6  7  8    6  7  8  9 10 11 12    6  7  8  9 10 11 12
           9 10 11 12 13 14 15   13 14 15 16 17 18 19   13 14 15 16 17 18 19
          16 17 18 19 20 21 22   20 21 22 23 24 25 26   20 21 22 23 24 25 26
          23 24 25 26 27 28 29   27 28                  27 28 29 30 31
          30 31
          ...
ps
Команда выводит список всех запущенных процессов. Когда эта команда выполняется без параметров, то выводимый список содержит информацию о номере процесса, связанном с ним терминале, времени работы процесса ps и командной оболочки, в которой он был запущен. Однако, эта команда имеет множество опций, позволяющих проследить многие параметры исполняющихся в системе процессов.
Команда ps обладает несколькими видами записи параметров, что может в вести в заблуждение: например, список всех исполняющихся процессов можно получить как с помощью команды ps ax или ps -ef, а также с помощью ps -A. На все возможные опции можно взгялнуть, запустив ps --help. Таким разнородным параметрам команда обязана своей долгой истории использования во всех версиях UNIX (например, ключи без знака «-» достались в наследство от BSD UNIX).
Для просмотра всех процессов можно воспользуемся следующей командой:
    user@desktop ~ $ ps aux
    USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    root       1  0.0  0.0   1432   480 ?        S    13:16   0:01 init [3]
    root       2  0.0  0.0      0     0 ?        SN   13:16   0:00 [ksoftirqd/0]
    root       3  0.0  0.0      0     0 ?        S<   13:16   0:00 [events/0]
    ..
    user    8456  0.3  4.4  34932 22944 ?        S    13:24   2:15 emacs
    user   22537  0.0  0.3   3720  1560 pts/3    Ss   22:37   0:00 /bin/bash
    user    8839  0.0  0.1   2644   932 pts/3    R+   23:01   0:00 ps aux
Вывод этой команды ориентирован на пользователя (ключ u), но отсортирован по времени запуска процесса. Здесь можно увидеть следующие параметры процесса: пользователь, идентификатор, уровень использования процессора, уровень использования памяти, объём используемой виртуальной памяти, объём используемой реальной памяти, терминал, с которым связан процесс, состояние выполнения, время старта, время исполнения (на процессоре), имя программы и аргументы запуска. Отметим, что сам процесс ps всегда находится в конце таблицы, так как сам выполнялся в момент сбора состояния процессов.
При добавлении параметра -H можно посмотреть процессы, выстроенные в иерархию:
    user@desktop ~ $ ps u -H
    USER   PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
    user 22537  0.0  0.3   3720  1560 pts/3    Ss   22:37   0:00 /bin/bash
    user  8890  0.0  0.1   2644   876 pts/3    R+   23:13   0:00   ps u -H
    user  9243  0.0  0.2   3724  1368 pts/1    Ss+  17:15   0:00 /bin/bash --noediting -i
    user  8033  0.0  0.3   3720  1568 tty1     S    13:17   0:00 -bash
    user  8168  0.0  0.2   3260  1120 tty1     S+   13:18   0:00   /bin/sh /usr/bin/startx
    user  8179  0.0  0.1   2240   636 tty1     S+   13:18   0:00     xinit .xinitrc --
    user  8186  0.0  0.2   3516  1080 tty1     S    13:18   0:00       sh /home/user/.xinitrc
    ...
В данном случае выводятся все процессы текущего пользователя.
pstree
Для иерархического отображения запущеных процессов больше подходит программа pstree, отображающая дерево запущенных процессов:
    user@desktop ~ $ pstree
    init─┬─acpid
         ├─5*[agetty]
         ├─2*[artsd]
         ├─cpufreqd
         ├─dcopserver
         ├─events/0
         ├─fcron
         ├─gconfd-2
         ├─hcid
         ├─kaccess
         ├─kded───kded───kded
         ├─kdeinit─┬─artsd───artsd───artsd
                  ├─kio_file
                  ├─kio_imap4───kio_imap4
    ...
Видно, что в вершине дерева находится специальный процесс init, который в UNIX является самым первым процессом, запускаемым операционной системой.
Эта команда также имеет множество ключей, настраивающих формат вывода информации о процессах.
top
Для вывода динамически изменяющейся информации о процессах и используемых ресурсах системы используется программа top. После запуска программы пользователь попадает в интерактивный интерфейс:
    Tasks:  86 total,   2 running,  84 sleeping,   0 stopped,   0 zombie
    Cpu(s):  6.2% us,  0.8% sy,  0.0% ni, 92.0% id,  0.6% wa,  0.3% hi,  0.0% si
    Mem:    512480k total,   428352k used,    84128k free,    44848k buffers
    Swap:   529160k total,    12312k used,   516848k free,   210444k cached

      PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
     8239 dralex    15   0 26856 8860 6512 S  7.9  1.7   5:39.31 artsd
        1 root      16   0  1432  480  420 S  0.0  0.1   0:01.22 init
        2 root      34  19     0    0    0 S  0.0  0.0   0:00.01 ksoftirqd/0
        3 root      10  -5     0    0    0 S  0.0  0.0   0:00.54 events/0
        4 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 khelper
        5 root      10  -5     0    0    0 S  0.0  0.0   0:00.00 kthread
        8 root      10  -5     0    0    0 S  0.0  0.0   0:00.59 kacpid
        7 root       7 -10     0    0    0 S  0.0  0.0   0:00.10 vesafb
    ...
Для выхода используется клавиша q. Программа имеет много управляющих клавиш, которые можно узнать, нажав на h (help).
Вверху экрана расположена общая информация о системе: число запущенных процессов, уровень использования процессора и памяти. Далее следует обновляемый список процессов в стиле ps, отсортированный по уменьшению процессорной активности.
free
Небольшая команда, предоставляющая информацию об использовании памяти. Она представлена не во всех современных версиях UNIX.
    user@desktop ~ $ free
                 total       used       free     shared    buffers     cached
    Mem:        512480     476256      36224          0      51216     251712
    -/+ buffers/cache:     173328     339152
    Swap:       529160      11500     517660
Команда выводит объём оперативной памяти (в килобайтах) и устройства своппинга: общий, свободный, занятый, используемый для системных нужд.
df
Существует команда и для простотра заполненности дисков.
Команда df выводит сведения обо всех примонтированных файловых системах:
    user@desktop ~ $ df
    Файловая система     1K-блоков      Исп  Доступно  Исп% смонтирована на
    /dev/hda6             24697672  21164336   3533336  86% /
    udev                    256240       180    256060   1% /dev
    /dev/hda1              9827968   8073084   1754884  83% /mnt/win
    none                    256240         0    256240   0% /dev/shm
    server:/home/shared    8194752   5368992   2416032  69% /mnt/shared
Для более «человеческого» представления объёма диска используется ключ -h:
    user@desktop ~ $ df -h
    Файловая система      Разм  Исп  Дост  Исп% смонтирована на
    /dev/hda6              24G   21G  3,4G  86% /
    udev                  251M  180K  251M   1% /dev
    /dev/hda1             9,4G  7,7G  1,7G  83% /mnt/win
    none                  251M     0  251M   0% /dev/shm
    server:/home/shared   7,9G  5,2G  2,4G  69% /mnt/shared
who
Команда выводит список пользователей, работающих в настоящий момент в системе.
При запуске без параметров для каждого сеанса пользователя выводится терминал и время входа в систему:
    user@desktop ~ $ who
    user   tty1         2005-10-24 13:17
    user   pts/0        2005-10-24 13:19
    user   pts/2        2005-10-24 23:59
При указании параметра -u выводится время неактивности для каждого терминала и идентификатор соответствующего ему процесса:
    user@desktop ~ $ who -u
    user   tty1         2005-10-24 13:17 11:41        7992
    user   pts/0        2005-10-24 13:19 11:41        8228
    user   pts/2        2005-10-24 23:59   .          9280
mount
Эта команда используется для монтирования новых файловых систем (подробнее об этом сказано в разделе «Дерево каталогов»). В общем случае команда mount имеет следующий формат:
mount [-t тип_ФС] имя_устройства точка_монтирования [опции]
Рассмотрим пример монтирования гибкого диска:
    user@desktop ~ $ mount -t vfat /dev/fd0 /mnt/floppy -o rw
    user@desktop ~ $ ls /mnt/floppy
    document.tex files/
В качестве файловой системы указан FAT, опции содержат флаг разрешения чтения и записи содержимого диска. После монтирования файлы доступны в директории /mnt/floppy.
Для размонтирования применяется команда umount.
При запуске mount без параметров выводится список всех примонтированных локальных и сетевых файловых систем:
    user@desktop ~ $ mount
    /dev/hda6 on / type reiserfs (rw,noatime)
    proc on /proc type proc (rw)
    sysfs on /sys type sysfs (rw)
    udev on /dev type tmpfs (rw,nosuid)
    devpts on /dev/pts type devpts (rw)
    /dev/hda1 on /mnt/win type ntfs (ro,uid=1000,gid=100,nls=utf8)
    none on /dev/shm type tmpfs (rw)
    usbfs on /proc/bus/usb type usbfs (rw,devmode=0664,devgid=85)
    server:/home/shared on /mnt/shared type nfs (rw,rsize=32768,wsize=32768,intr,...
Можно увидеть ряд служебных файловых систем (proc, udev, sysfs, т.п.).
uname
Вывод имени запущенной UNIX-системы.
    user@desktop ~ $ uname
    Linux
Для вывода полного имени используется параметр -a:
    user@desktop ~ $ uname -a
    Linux thinkpad 2.6.13-gentoo-r4 #1 Mon Oct 17 12:09:36 MSD 2005 i686 Intel(R)...

Команды по работе с процессами[править]

kill
Команда используется для отправки сигнала процессу.
Команда kill имеет один из следующих форматов:
kill [-s название_сигнала] идентификатор_процесса
kill -название_сигнала идентификатор_процесса
kill -код_сигнала идентификатор_процесса
Для того, чтобы отправить сигнал, необходимо знать идентификатор процесса-получателя. Узнать идентификатор можно с помощью команды ps. Если при вызове команды kill сигнал не указан, то посылается сигнал TERM. Обычный пользователь может посылать сигналы только своим процессам. Посылать сигналы процессам других пользователей может только суперпользователь. Рассмотрим пример уничтожения процесса:
    user@desktop ~ $ ps
    PID  TT  STAT      TIME COMMAND
    3800  p3  S      0:00,03 su (bash)
    3822  p3  T      0:00,08 mplayer /home/guest/music/U96/Das\ Boot.mp3
    3824  p3  R+     0:00,00 ps
    user@desktop ~ $ kill 3822
После вызова команды kill 3822 процесс mplayer будет уничтожен.
Для вывода списка всех сигналов используется команда kill -l:
    user@desktop ~ $ kill -l
    1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
    5) SIGTRAP      6) SIGABRT      7) SIGEMT       8) SIGFPE
    9) SIGKILL     10) SIGBUS      11) SIGSEGV     12) SIGSYS
    13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGURG
    17) SIGSTOP     18) SIGTSTP     19) SIGCONT     20) SIGCHLD
    21) SIGTTIN     22) SIGTTOU     23) SIGIO       24) SIGXCPU
    25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
    29) SIGINFO     30) SIGUSR1     31) SIGUSR2
exec
Является встроенной командой оболочки. Используется для замены процесса shell другим процессом.
Команда exec имеет следующий синтаксис:
exec -lc -a имя исполняемый файл [перенаправление ...]
fork (&)
Символ «&» используется для запуска программ в фоновом режиме. Пример:
    user@desktop ~ $ mplayer /home/guest/music/U96/Das\ Boot.mp3&
    [1] 1558
bg, fg и jobs
Являются встроенными командами оболочки. Команды используются для работы с заданиями – процессами, запущенными из командного интерпретатора.
Команда jobs имеет следующий синтаксис:
jobs [-lnprs] [jobspec ...]
jobs -x команда [аргументы]
Для вывода всех заданий используется команда jobs:
    user@desktop ~ $ jobs
    [1]+  Running                 nice -n 20 tar -cyf test.tar.bz2 /home/guest/data/* &
    [2]+  Stopped                 nice -n 20 tar -cyf test.tar.bz2 /home/guest/texts/*
    [3]-  Exit 127                nice 20 tar -cyf /abcdefg/texts ./test.tar.bz2
    [4]+  Done                    tar -cyf test.tar.bz2 text.txt
Напротив идентификатора задания указано состояние процесса.
Для вывода, кроме основной информации, идентификаторов запущенных процессов используется флаг -l. Для вывода только идентификаторов запущенных процессов используется флаг -p. Для вывода информации о процессах, у которых изменилось состояние с момента последнего вызова команды jobs используется флаг -n.
Команда bg используется для перевода задачи в фоновый режим.
Команда имеет следующий синтаксис:
bg [идентификатор_задачи]
Запуск команды без параметров приводит к запуску в фоновом режиме текущей задачи. Если указан параметр идентификатор_задачи, то в фоновом режиме будет запущена указанная задача. Пример:
    user@desktop ~ $ bg
    [1]+ nice -n 20 tar -cyf test.tar.bz2 /home/guest/texts/* &
Команда fg используется для перевода задачи на передний план.
Команда имеет следующий синтаксис:
fg [идентификатор_задачи]
Запуск команды без параметров переводит к переводу текущей задачи на передний план. Если указан параметр идентификатор_задачи, то задача с указанным идентификатором станет текущей и будет переведена на передний план. Пример:
    user@desktop ~ $fg
    nice -n 20 tar -cyf test.tar.bz2 /home/guest/texts/*
nohup
Команда позволяет запустить процесс, отключив его от управляющего терминала.
Команда nohup имеет следующий синтаксис:
nohup [--] запускаемая_программа [аргументы]
nohup запускает указанную программу с игнорированием сигналов HUP и увеличением приоритета для планировщика задач на 5. Таким образом, команда может продолжать выполняться в фоновом режиме и после того, как пользователь выйдет из системы. Если стандартным выводом stdout команды является терминал, то он и стандартный поток ошибок stderr перенаправляются в файл nohup.out в текущей директории. Если это невозможно, то перенаправление происходит в файл $HOME/nohup.out. Если и это невозможно сделать, то команда не запускается. Команда nohup не переводит автоматически запускаемый процесс в фоновый режим. Чтобы это сделать, необходимо завершить команду символом &.
Пример использования:
    user@desktop ~ $ nohup mplayer /home/guest/music/U96/Das\ Boot.mp3
    appending output to /home/guest/nohup.out
nice
Команда используется для запуска процесса с измененным приоритетом для планировщика задач.
Команда nice имеет следующий формат:
nice [-n смещение_приоритета] запускаемая_программа [аргументы]
Команда nice позволяет изменять приоритет от -20 (наивысший) до 20 (самый низкий) от текущего. По умолчанию, процессы имеют приоритет командного интерпретатора, из которого они запускаются. Повышать приоритет может только суперпользователь (т.е. задавать отрицательное значение параметра -n смещение_приоритета). Пример использования команды:
    user@desktop ~ $ nice -n 15 mplayer /home/guest/music/U96/Das\ Boot.mp3 &
    [1] 895
    uest@premudrij-peskar$ ps -l
    UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    1002   890   889   0   8  0  3112  1660 wait   S     p2    0:00,02 su (bash)
    1002   895   890   0 111 15 23000 13200 -      TN    p2    0:00,08 mplayer /home/guest/music/U96/Das\ Boot.mp3
    1002   896   890   0  96  0  1392   768 -      R+    p2    0:00,00 ps -l
Значение NI процесса mplayer равно 15, для всех остальных процессов равно 0 по умолчанию.
renice
Команда используется для изменения приоритета запущенных процессов.
Команда renice имеет следующий формат:
renice новое_значение_приоритета список_идентификаторов
renice -n смещение_приоритета список_идентификаторов
Для изменения значения приоритета отдельных процессов достаточно перечислить их идентификаторы:
    user@desktop ~ $ ps -l
    UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    1002   890   889   0  96  0  3112  1600 -      R     p2    0:00,06 su (bash)
    1002   895   890   0 111 17 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002   900   890   0 101  5 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002  1084   890   1  96  0  1392   760 -      R+    p2    0:00,00 ps -l
    user@desktop ~ $ renice +18 895 900
    895: old priority 17, new priority 18
    900: old priority 5, new priority 18
    user@desktop ~ $ ps -l
    UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    1002   890   889   0   8  0  3112  1600 wait   S     p2    0:00,06 su (bash)
    1002   895   890   0 111 18 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002   900   890   0 101 18 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002  1086   890   0  96  0  1392   760 -      R+    p2    0:00,00 ps -l
Для изменения приоритета всех процесов какого-либо пользователя необходимо указать флаг -u. В этом случае значения идентификаторов после флага -u будут интерпретироваться как идентификаторы пользователей. Можно задавать как числовые, так и символьные идентификаторы пользователей.
    user@desktop ~ $ renice -n 1 -u guest
    1002: old priority 0, new priority 1
    user@desktop ~ $ ps -l
    UID   PID  PPID CPU PRI NI   VSZ   RSS MWCHAN STAT  TT       TIME COMMAND
    1002   890   889   0   8  1  3112  1600 wait   SN    p2    0:00,07 su (bash)
    1002   895   890   0 111 18 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002   900   890   0 101 18 23000 11224 -      TN    p2    0:00,08 mplayer Boot.mp3
    1002  1110   890   0  97  1  1392   760 -      RN+   p2    0:00,00 ps -l
Из данного примера видно, что значения NI для процессов mplayer не изменились. Вызов команды renice с флагом -n изменяет только минимальные приоритеты (в данном случае, нули).

Резюме[править]

В данном разделе рассматриваются команды управления процессами и сбора сведений о системе.

Ключевые термины:date, cal, ps, pstree, top, free, df, who, mount, uname, kill, exec, fork (&), bg, fg и jobs, nohup, nice, renice

Дополнительные материалы[править]

  1. Курячий Г.В., Маслинский К.А. Операционная система Linux. – М.: Интуит.Ру, 2005. – 392 с.: ил.
  2. Курячий Г.В. Операционная система UNIX. – М.: Интуит.Ру, 2004. – 292 с.: ил.
  3. Рейчардс К., Фостер-Джонсон Э. UNIX: справочник. – СПб.: Питер Ком, 1999. – 384 с.: ил.

Практическое занятие. Сбор сведений о системе и управление процессами[править]

Цель занятия: знакомство с командами по работе с процессами и командами, предоставляющимиприменение предоставляющими сведения о системе.

Изучаемые команды: mount, ps, pstree, top, uname, who, bg, fg и jobs, grep, pstree, kill, mkfifo, nohup, nice, renice

Сценарий: Сбор сведений о системе[править]

В данном сценарии изучаются команды, предоставляющие сведения о системе.

Начальные условия: Командная строка после входа в систему.

1. Определить имя текущей UNIX-системы с помощью команды uname -a

      user@desktop ~ $ uname -a
      Linux thinkpad 2.6.13-gentoo-r4 #1 Mon Oct 17 12:09:36 MSD 2005 i686 Intel(R)...

Здесь выводится полная версия системы, дата компиляции ядра и тип процессора.

2. Вывести содержимое директории proc с помощью команды ls /proc:

      user@desktop ~ $ ls /proc
      1/     7/     8113/  8209/  9073/       dri/         modules
      103/   7060/  8124/  8211/  9324/       driver/      mounts@
      106/   7128/  8125/  8213/  9325/       execdomains  mtrr
      185/   7693/  8131/  8215/  937/        fb           net/
      186/   7770/  8135/  8319/  9376/       fb1/         partitions
      ...

Признаком операционной системы Linux является наличие директории /proc, которая содержит псевдофайлы, предоставляющие системную информацию и позволяющие настраивать ядро.

3. Вывести текущие пользовательские сеансы с помощью команды who:

      user@desktop ~ $ who
      user   tty1         2005-10-24 13:17
      user   pts/0        2005-10-24 13:19
      user   pts/2        2005-10-24 23:59

4. Вывести список всех примонтированных устройств с помощью команды mount:

      user@desktop ~ $ mount
      /dev/hda6 on / type reiserfs (rw,noatime)
      proc on /proc type proc (rw)
      sysfs on /sys type sysfs (rw)
      udev on /dev type tmpfs (rw,nosuid)
      devpts on /dev/pts type devpts (rw)
      /dev/hda1 on /mnt/win type ntfs (ro,uid=1000,gid=100,nls=utf8)

Первый столбец – имя устройства, второй – точка монтирования, далее следует тип файловой системы и опции монтирования.

5. Вывести загруженность примонтированных дисков с помощью команды df -h:

      user@desktop ~ $ df -h
      Файловая система      Разм  Исп  Дост  Исп% смонтирована на
      /dev/hda6              24G   21G  3,4G  86% /
      udev                  251M  180K  251M   1% /dev
      /dev/hda1             9,4G  7,7G  1,7G  83% /mnt/win
      none                  251M     0  251M   0% /dev/shm

6. Вывести информацию о всех выполняющихся процессах с помощью команды ps aux:

      user@desktop ~ $ ps aux
      USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root       1  0.0  0.0   1432   480 ?        S    13:16   0:01 init [3]
      root       2  0.0  0.0      0     0 ?        SN   13:16   0:00 [ksoftirqd/0]
      root       3  0.0  0.0      0     0 ?        S<   13:16   0:00 [events/0]
      ..
      user    8456  0.3  4.4  34932 22944 ?        S    13:24   2:15 emacs
      user   22537  0.0  0.3   3720  1560 pts/3    Ss   22:37   0:00 /bin/bash
      user    8839  0.0  0.1   2644   932 pts/3    R+   23:01   0:00 ps aux

7. Оставить в выводе предыдущей команды только системные процессы с помощью команды ps aux | grep -v user:

      user@desktop ~ $ ps aux | grep -v user
      USER     PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root       1  0.0  0.0   1432   480 ?        S    13:16   0:01 init [3]
      root       2  0.0  0.0      0     0 ?        SN   13:16   0:00 [ksoftirqd/0]
      root       3  0.0  0.0      0     0 ?        S<   13:16   0:00 [events/0]
      ...
      root      6989  0.0  0.1   1672   704 ?        Ss   Oct25   0:00 /usr/sbin/syslog
      root      7128  0.0  0.1   2020   716 ?        Ss   Oct25   0:00 /usr/sbin/fcron

Часть процессов, показанные в квадратных скобках, – это потоки ядра, исполняющие специальные функции. Можно выделить демонов – в столбце терминала они имеют символ «?». Например, системный журнал (syslog) или планировщик задач (cron).

8. Вывести иерархию процессов с помощью команды pstree:

      user@desktop ~ $ pstree
      init─┬─acpid
           ├─5*[agetty]
           ├─2*[artsd]
           ├─cpufreqd
           ├─dcopserver
           ├─events/0
           ├─fcron
           ├─gconfd-2
           ├─hcid
           ├─kaccess
           ├─kded───kded───kded
           ├─kdeinit─┬─artsd───artsd───artsd
                    ├─kio_file
                    ├─kio_imap4───kio_imap4
      ...

В вершине дерева стоит процесс init.

9. Рассмотреть поведение процессов интерактивно с помощью команды top.

Сценарий: Управление процессами с помощью сигналов[править]

В данном сценарии изучаются сигналы, управляющие клавиши для передачи процессам сигналов, команды для управления процессами.

Начальные условия: Командная строка после входа в систему.

1. Запустите команду yes, производящую бесконечный вывод символа y на экран. Прервите её нажатием Ctrl-C.

      user@desktop ~ $ yes
      y
      y
      y
      y
      ...
      y

      user@desktop ~ $

При этом запущенному процессу был отправлен сигнал SIGTERM – завершения программы.

2. Запустим сбор информации обо всех файлах системы с помощью команды find / > files.txt.

user@desktop ~ $ find / > files.txt

3. Найдем идентификатор запущенного только что процесса с помощью команды ps aux | grep find, запущенной в другом терминале.

      user@desktop ~ $ ps aux | grep find
      user    8178  9.7  0.1   2844  1020 pts/1    R+   23:45   0:00 find /
      user    8230  0.0  0.1   2708   736 pts/2    R+   23:45   0:00 grep find

Первая строка содержит необходимый PID.

4. Отправим сигнал завершения этому процессу с помощью команды kill 8178, указав в качестве параметара идентификатор процесса.

user@desktop ~ $ kill 8178

Можно убедиться, что на терминале с запущенной командой появились строка «Terminated» и приглашение.

5. Если попытаться завершить системный процесс, например командой kill 1, появится сообщение об ошибке доступа:

      user@desktop ~ $ kill 1
      bash: kill: (1) - Operation not permitted

Отправление сигналов системным процессам может производить только суперпользователь.

6. Альтернативным способом отправления сигналов процессам – по имени процесса, а не по PID – является команда killall. Выполнив команду killall bash, мы завершим все командные оболочки, а тем самым и сеансы пользователей.

user@desktop ~ $ killall bash

7. До этого мы отправляли только сигнал завершения процесса. Он может перехватываться и игнорироваться программами. Неперехватываемым является сигнал SIGKILL, который может быть отправлен, например, следующей командой: killall -SIGKILL find

user@desktop ~ $ killall -SIGKILL find

Сценарий: Выполнение задач в фоновом режиме[править]

В данном сценарии изучается работа с заданиями командной оболочки, запуск заданий в фоновом режиме.

Начальные условия: Командная строка после входа в систему.

1. Запустим длительную команду, например find / > files.txt и приостановим её выполнение с помощью нажатия Ctrl-Z. При этом процессу посылается сигнал SIGSTOP.

      user@desktop ~ $ find / > files.txt

      [1]+  Stopped                 find / > files.txt
      user@desktop ~ $

Команда приостановлена и запомнена как задача 1 (номер в квадратных скобках).

2. Текущий список запущенных задач командной оболочки можно посмотреть командой jobs.

      user@desktop ~ $ jobs
      [1]+  Stopped                 find / > files.txt

3. Возобновить исполнение задания можно командой fg 1, аргументом которой является номер задания.

      user@desktop ~ $ fg 1
      find / > files.txt

4. Если еще раз приостановить процесс, можно запустить задачу в фоновом режиме: bg 1.

      user@desktop ~ $ bg 1
      [1]+ find / > files.txt &
      user@desktop ~ $

Тогда можно будет продолжать работу в командной строке.

5. Команды можно сразу запускать в фоновом режиме. При этом необходимо добавить символ «&» (амперсанд) в конец строки команды: find / -name "*.xml" > xml-list &

      user@desktop ~ $ find / -name "*.xml" > xml-list &
      [1] 9413
      user@desktop ~ $

При этом командная оболочка выводит номер задания и PID созданного процесса.

Сценарий: Запуск демонов[править]

В данном сценарии рассматриваются демоны как процессы, не связанные ни с одним терминалом.

Начальные условия: Командная строка после входа в систему.

1. Если запустить команду в фоновом режиме и выйти из командной оболочки: например, find / -name "*.html" -exec grep -Hn "linux loader" \{} \; & и exit, то запущенная команда завершится по сигналу SIGHUP.

     user@desktop ~ $ find / -name "*.html" -exec grep -Hn "linux loader"
                 \{} \; &
     [1] 9555
     user@desktop ~ $ exit

2. Для того, чтобы программы не получали сигнал SIGHUP, используется специальная команда nohup: nohup find / -name "*.txt" -exec grep -Hn "linux loader" \{} \; &

      user@desktop ~ $ nohup find / -name "*.html" -exec grep -Hn "linux loader" \{} >> result\; &
      [1] 9783
      user@desktop ~ $ exit

Эта программа завершится корректно после окончания поиска.

Сценарий: Изменение приоритетов выполняющихся программ[править]

В данном сценарии изучается механизм приоритетов UNIX и команды для изменения приоритетов запускаемых процессов.

Начальные условия: Командная строка после входа в систему.

1. Каждый процесс в системе имеет свой уровень приоритета (в UNIX он называется «nice»), который можно увидеть с помощью команды ps -l – в столбце «NI».

      user@desktop ~ $ ps -l
      F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
      0 S  1000 17223 17222  0  75   0 -   994 wait   pts/1    00:00:00 bash
      0 R  1000 17485 17223  0  75   0 -   612 -      pts/1    00:00:00 ps

По умолчанию, приоритет процессов простого пользователя равен нулю.

2. Для запуска процесса с заданным приоритетом воспользуемся командой nice. Напрмер, запустим создание архива с пониженным приоритетом: nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/.

      user@desktop ~ $ nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/

3. Чтобы изменить приоритет уже запущенной программы используется команда renice. Например, для понижения приоритета заранее запущенного процесса архивации tar -cjf libraries.tar.bz2 /usr/lib & воспользуемся командой renice +10 -p 3442:

      user@desktop ~ $ tar -cjf libraries.tar.bz2 /usr/lib &
      [1] 3442
      user@desktop ~ $ renice +10 -p 3442

Простые пользователи не могут повышать приоритет процессов, только понижать.

Задания для самоподготовки[править]

  1. Сравните время создания корневой директории с текущим временем системы.
  2. Получите список всех типов файловых систем, примонтированных в настоящий момент. Какой тип имеет корневая файловая система?
  3. Найдите три процесса, использующих самый большой объём памяти. Какой процент памяти они потребляют от общего объёма?
  4. Получите иерархию родительских процессов для текущей командной оболочки.
  5. Найдите, в каком файле в директории /proc хранится информация о системной памяти.
  6. С помощью сигнала остановки процесса и команды bg запустите три параллельных процесса архивации директории /etc, /home и /tmp.

Сценарии практического занятия на тему: Сбор сведений о системе и управление процессами[править]

«Сценарий: Сбор сведений о системе»

  1. uname -a
    
  2. ls /proc
    
  3. who
    
  4. mount
    
  5. df -h
    
  6. ps aux
    
  7. ps aux | grep -v user
    
  8. pstree
    
  9. top
    

«Сценарий: Управление процессами с помощью сигналов»

  1. yes
    
  2. find / > files.txt
    
  3. ps aux | grep find
    
  4. kill 8178
    
  5. kill 1
    
  6. killall bash
    
  7. killall -SIGKILL find
    

«Сценарий: Выполнение задач в фоновом режиме»

  1. find / > files.txt
    
  2. jobs
    
  3. fg 1
    
  4. bg 1
    
  5. find / -name "*.xml" > xml-list &
    

«Сценарий: Запуск демонов»

  1. find / -name "*.html" -exec grep -Hn "linux loader" \{} \; &
    
  2. exit
    
  3. nohup find / -name "*.txt" -exec grep -Hn "linux loader" \{} \; &
    

«Сценарий: Изменение приоритетов выполняющихся программ»

  1. ps -l
    
  2. nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/
    
  3. tar -cjf libraries.tar.bz2 /usr/lib &
    
  4. renice +10 -p 3442