Введение в администрирование UNIX/Командная строка UNIX
Операционная система предоставляет пользователю специальный интерфейс – командную строку, через которую пользователи получают персональную рабочую среду. Несмотря на то, что в современных UNIX-системах широко используются графические пользовательские интерфейсы, командная строка остаётся основным рабочим инструментом администратора системы.
Терминал и командная строка
[править]Терминал
[править]В операционной системе UNIX основными средствами взаимодействия пользователя с системой являются клавиатура и экран монитора, работающий в текстовом режиме. Вводимый пользователем текст немедленно отображается на мониторе соответствующими знаками, однако может и не отображаться (например, в случае ввода пароля). Для управления вводом используются некоторые нетекстовые клавиши на клавиатуре: Backspace (он же «Забой») — для удаления последнего введенного символа или Enter — для передачи команды системе. Нажатие на эти клавиши не приводит к отображению символа, вместо этого вводимый текст обрабатывается системой тем или иным способом — эти клавиши и их комбинации объединяют понятием управляющие символы.
Текстовый принцип работы с машиной позволяет отвлечься от конкретных частей компьютера, вроде системной клавиатуры и видеокарты с монитором, рассматривая единое конечное устройство, посредством которого пользователь вводит текст и передает его системе, а система выводит необходимые пользователю данные и сообщения. Такое устройство называется терминалом. В общем случае терминал — это точка входа пользователя в систему, обладающая способностью передавать текстовую информацию. Терминалом может быть отдельное внешнее устройство, подключаемое к компьютеру через порт последовательной передачи данных («COM-порт»). В роли терминала может работать (с некоторой поддержкой со стороны системы) и программа (например, xterm или ssh).
Свойство терминала передавать только символьную информацию приводит к тому, что некоторые из передаваемых символов должны восприниматься не как текстовые, а как управляющие (например, символы, возвращаемые клавишами Backspace и Enter). На самом деле управляющих символов больше: часть из них предназначена для экстренной передачи команд системе, часть — для редактирования вводимого текста. Многие из этих символов не имеют специальной клавиши на клавиатуре, поэтому их необходимо извлекать с помощью клавиатурного модификатора Ctrl. Проблема в том, что на клавиатуре может быть так много разных нетекстовых клавиш, что на них не хватает ограниченного количества разных управляющих символов. Поэтому большинство нетекстовых клавиш возвращают так называемую управляющую последовательность, которая начинается управляющим символом, за которым следует строго определенное число обычных символов.
Одной из полезных особенностей терминала является возможность его «прокрутки» с помощью клавиш Shift-PgUp и Shift-PgDn. Это может быть полезно, если вывод программы занимает больший объём, чем размер экрана.
Командная оболочка
[править]Основная среда взаимодействия с UNIX — командная строка. Суть её в том, что каждая строка, передаваемая пользователем системе, — это команда, которую та должна выполнить. Пока не нажата клавиша Enter, строку можно редактировать, затем она отсылается системе.
Команды интерпретируются и выполняются специальной программой — командной оболочкой (или «shell», по-английски). Через командную оболочку производится управление пользовательскими процессами — для этого используются средства межпроцессного обмена, описанные ранее (см. «Межпроцессное взаимодействие»).
Командная оболочка непосредственно связана с терминалом, через который осуществляется передача управляющих последовательностей и текста. На рисунке Рисунок 2.1, «Интерфейс командной строки» представлена общая схема взаимодействия пользователя с системой при использовании командной строки.
Одновременный доступ к системе
[править]То, что UNIX — многопользовательская и многозадачная система, проявляется не только в разграничении прав доступа (см. раздел Глава 3, Безопасность операционной системы UNIX), но и в организации рабочего места. Каждый компьютер, на котором работает UNIX, предоставляет возможность зарегистрироваться и получить доступ к системе нескольким пользователям одновременно. Даже если в распоряжении всех пользователей есть только один монитор и одна системная клавиатура, эта возможность небесполезна: одновременная регистрация в системе нескольких пользователей позволяет работать по очереди без необходимости каждый раз завершать все начатые задачи (закрывать все окна, прерывать исполнение всех программ) и затем возобновлять их. Более того, ничто не препятствует зарегистрироваться в системе несколько раз под одним и тем же входным именем. Таким образом, можно получить доступ к одним и тем же ресурсам (своим файлам) и организовать параллельную работу над несколькими задачами.
Характерный для современных версий UNIX способ организации параллельной работы пользователей — виртуальные консоли. Виртуальные консоли (virtual console) — это несколько параллельно выполняемых операционной системой программ, предоставляющих пользователю возможность зарегистрироваться в системе в текстовом режиме и получить доступ к командной строке (см. Рисунок 2.2, «Виртуальные и графические консоли»).
В операционной системе Linux переключение между виртуальными консолями в текстовом режиме производится с помощью комбинации клавиш Alt-F1, Alt-F2 и т. п.. При этом каждая виртуальная консоль обозначается специальным именем: «tty1», «tty2» и т. д.. По умолчанию в Linux доступно не менее шести виртуальных консолей, переключаться между которыми можно при помощи сочетания клавиши Alt с одной из функциональных клавиш (F1-F6). С каждым сочетанием связана соответствующая по номеру виртуальная консоль. Виртуальные консоли обозначаются «ttyN», где «N» — номер виртуальной консоли. На самом деле, каждая из таких консолей связано с собственным терминалом, который характеризуется файлом устройства с соответствующим именем (например, /dev/tty1).
Современные версии UNIX предоставляют пользователям графические пользовательские интерфейсы (подробнее графическая подсистема UNIX рассматривается в разделе Глава 7, Графическая подсистема UNIX), которые также дают возможность работы в командной строке. Эта возможность достигается с помощью графических терминалов — специальных программ, которые эмулируют текстовый терминал в графическом окне.
Также существует возможность запуска нескольких графических подсистем, тогда переключение между ними будет осуществляться аналогично переключению между виртуальными консолями — комбинацией клавиш Ctrl-Alt-F1.
Каждое устройство терминала имеет свои возможности по вводу и выводу информации. Примерами таких возможностей являются: число цветов отображения, способность перемещать курсор и изменять размер экрана, набор управляющих символов и т. п.. Терминалы разделяют по типам: набору возможностей, регламентированных в специальном конфигурационном файле. Примерами типов являются: tty (телетайп) или xterm (графический терминал). Тип терминала явно указан в имени устройства терминала (например, /dev/tty1). Все настройки типов терминалов находятся в директории /etc/termcap.
Формат командной строки
[править]Приглашение
[править]Командная строка состоит из приглашения и вводимой команды. Приглашение — это специальная последовательность символов, которая располагается в начале строки и задает начало области ввода команды. Рассмотрим пример выполнения команды:
Пример 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.
- Перенаправления
- Стандартный ввод и вывод каждой команды (см. «Межпроцессное взаимодействие») может быть перенаправлен в файл. По умолчанию ввод и вывод команды связываются с пользовательским терминалом. Для указания источника ввода или назначения вывода (для обычной информации и для ошибок отдельно) используются специальные символы (<, > и >>).
Как правило, порядок данных частей команды должен быть именно таким, однако некоторые из них (кроме имени команды) могут отсутствовать.
Процесс выполнения команды
[править]Командная оболочка — это обычный процесс в операционной системе UNIX. Когда пользователь вводит команду (например, по нажатию Enter), командная оболочка выполняет следующие действия:
- анализ команды: выделение имени, параметров и аргументов;
- если это встроенная команда, для неё вызывается функция-обработчик;
- если это внешняя команда:
- производится поиск программы с соответствующим именем;
- создаётся дочерний процесс оболочки (системный вызов fork);
- в дочернем процессе запускается необходимая команда с расшифрованными параметрами и аргументами (системный вызов exec);
- оболочка контролирует выполнение дочернего процесса, передаёт ему сигналы и ввод пользователя, ожидает его завершения (системный вызов wait);
- результаты работы возвращаются пользователю, отображается приглашение — он может вводить следую команду.
Возвращаемое значение
[править]Каждый процесс при завершении возвращает своему родительскому процессу специальный код завершения программы. Этот код может использоваться для получения результата выполнения программы и для проверки корректности её выполнения (возврата кода ошибки).
Традиционно для 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
Способы объединения команд
[править]Существует возможность объединять несколько команд в одной командной строке. Это можно делать несколькими способами:
- Последовательное выполнение
- Команды выполняются одна за другой, независимо от результата их исполнения. В качестве разделителя выступает символ точки с запятой («;»).
- В качестве примера можно рассмотреть составную команду 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, удаляет из него повторяющиеся строки и сортирует оставшиеся строки по алфавиту. Результат выводится на экран.
Современные командные оболочки позволяют строить более гибкие условные выражения (с использованием скобок и знака отрицания) из выполняющихся команд.
Служебные символы
[править]Из предыдущих разделов видно, что в командной строке присутствует множество служебных символов, каждый из которых имеет своё значение. Все эти символы следует с осторожностью использовать в именах файлов.
Рассмотрим основные группы служебных символов командной оболочки:
- Символы-разделители
- Используются для отделения частей команды или нескольких команд. К ним относятся: пробел, табуляция. По умолчанию команды разделяются символом перевода строки. При использовании символа пробела в именах файлов необходимо заключать параметр в кавычки или предварять пробел символом обратной косой («\»).
- Символы пути
- Используются для разделения элементов пути. Сюда можно отнести символ корня («/») и символ домашней директории («~») — в командной строке он автоматически заменяется на полный путь к домашней директории. При наличии этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
- Символы команд
- Применяются в аргументах команд, для отделения нескольких команд, для запуска процессов на заднем фоне и т. п. К таким символам можно отнести: «*», «&», «<», «>», «;», "(", «)», "|", """. При наличии этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
- Символ параметров команды
- Символ «-» используются для задания параметров команд. Проблемы могут возникнуть, если имя файла начинается с этого символа — в этом случае командная оболочка может принять такой аргумент за набор параметров. Стандартным выходом из этой ситуации является явное указание окончания списка параметров с «--», например:
user@desktop ~ $ ls -l -- -test-file
-rw-r--r-- 1 user users 90 Сен 19 00:20 -test-file
- Символы управления переменными
- Используются для задания («=») и подстановки («$») значений переменных среды. При наличии этих символов в именах файлов необходимо предварять их символом обратной косой («\»).
- ESC-символы
- Специальные ASCII-символы, вроде возврата каретки или табуляции. Их синтаксис эквивалентен используемому в языке C — с применением символа обратной косой («\»).
Программное окружение
[править]Каждый запускаемый процесс система снабжает неким информационным пространством, которое этот процесс вправе изменять как ему заблагорассудится. Правила пользования этим пространством просты: в нем можно задавать именованные хранилища данных (переменные окружения), в которые записывать какую угодно информацию (присваивать значение переменной окружения), а впоследствии эту информацию считывать (подставлять значение переменной).
В 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
- Имя текущего пользователя.
- _ (одиночный символ подчёркивания)
- В точности последняя команда, выполненная в командной оболочке.
Возможности интерфейса командной оболочки
[править]Современные командные оболочки, например 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, остается за рамками этого курса.
Справочная подсистема
[править]Работать с UNIX, не заглядывая в документацию, практически невозможно. К счастью, документированы практически все области операционной системы. Всем пользователям настоятельно рекомендуется, приступая к работе, а тем более — к изучению UNIX, пользоваться всеми доступными руководствами. Исторически первым и основным средством документации во всех версиях являются страницы руководства (manual pages), которые будут подробно рассмотрены далее.
Документация в подавляющем большинстве случаев пишется на простом английском языке. Если английский — не родной язык для автора документации, она будет только проще. Традиция писать по-английски идет от немалого вклада США в развитие компьютерной науки вообще и UNIX в частности. Кроме того, английский становится языком международного общения во всех областях, не только в компьютерной. Необходимость писать на языке, который будет более или менее понятен большинству пользователей, объясняется постоянным развитием UNIX. Дело не в том, что страницу руководства нельзя перевести, а в том, что ее придется переводить всякий раз, когда изменится описываемый ею объект! Например, выход новой версии программного продукта сопровождается изменением его возможностей и особенностей работы, а следовательно, и новой версией документации.
Документация в UNIX играет важнейшую роль. Решение любой задачи должно начинаться с изучения руководств. Не стоит жалеть на это времени. Даже если рядом есть опытный пользователь UNIX, который, возможно, знает ответ, не стоит беспокоить его сразу же. Возможно, даже зная, что нужно сделать, он не помнит как именно — и поэтому (а также потому, что он — опытный пользователь) начнет с изучения руководства. Это — закон, у которого даже собственное название: RTFM, что означает «Read That Fine Manual».
Современные свободные UNIX-системы обладают большим сообществом пользователей и разработчиков, объединённых через Интернет. В этих сообществах является нормальной практикой взаимопомощь и ответы на вопросы по системе. Однако, здесь необходимо следовать описанному выше принципу RTFM.
Страницы руководcтва
[править]Больше всего полезной информации содержится в страницах руководства, для краткости мы будем называть их просто «руководство». Каждая страница посвящена какому-нибудь одному объекту системы. Для того чтобы посмотреть страницу руководства, нужно дать команду системе man объект:
user@desktop ~ $ man cal
CAL(1) BSD General Commands Manual CAL(1)
- NAME
- cal — displays a calendar
- SYNOPSIS
- cal [-smjy13] [[month] year]
- DESCRIPTION
- Cal displays a simple calendar.
- If arguments are not specified,
- the current month is displayed.
- The options are as follows:
…
Страница руководства занимает, как правило, больше одной страницы экрана. Для того чтобы читать было удобнее, man запускает программу постраничного просмотра текстов — less. Управлять программой less просто: страницы перелистываются пробелом, а когда читать надоест, надо нажать q (Quit). Перелистывать страницы можно и клавишами Page Up/Page Down, для сдвига на одну строку вперед можно применять Enter или стрелку вниз, а на одну строку назад — стрелку вверх. Переход на начало и конец текста выполняется по командам g и G соответственно (Go). Полный список того, что можно делать с текстом в less, выводится по команде h (help). Для поиска и подстветки интересующего понятия можно воспользоваться командой /, после которой необходимо ввести интересующий Вас термин — по нажатию клавиши Enter, курсор перейдёт к первому упоминанию термина, который будет выделен серым цветом. Последующие нажатия / и Enter приведут к продолжению поиска слова по документу.
Страница руководства состоит из полей — стандартных разделов, с разных сторон описывающих заинтересовавший объект — например, команду cal. В поле NAME содержится краткое описание объекта (такое, чтобы его назначение было понятно с первого взгляда). В поле SYNOPSIS дается формализованное описание способов использования объекта (в данном случае — того, как и с какими параметрами запускать команду cal). Как правило, в квадратные скобки в этом поле заключены необязательные параметры команды, которые можно ей передать, а можно и опустить. Например, строка «[[month] year]» означает, что в этом месте командной строки параметров у команды может не быть вообще, может быть указан год или пара — месяц и год. Наконец, текст в поле DESCRIPTION — это развернутое описание объекта, достаточное для того, чтобы им воспользоваться.
Одно из самых важных полей руководства находится в конце текста. Если в процессе чтения NAME или DESCRIPTION пользователь понимает, что не нашел в руководстве того, что искал, он может захотеть посмотреть, а есть ли другие руководства или иные источники информации по той же теме. Список таких источников содержится в поле SEE ALSO:
user@desktop ~ $ man man
…
- SEE ALSO
- apropos(1), whatis(1), less(1), groff(1), man.conf(5).
Справочные руководства делятся на разделы — в зависимости от типа описываемых объектов. Если один и тот же термин описывается в нескольких разделах, необходимо явно указать, какой из них использовать, например, man 3 printf для 3-го раздела руководств.
Всего существует 8 разделов руководств:
- пользовательские утилиты и прочие инструменты
- системные вызовы
- библиотечные функции
- внешние устройства (и их представление в системе)
- форматы и таблицы (типы файлов, протоколы и прочее)
- игры и всевозможные «ненужные» утилиты
- «остальное», то есть то, что не подходит под другие разделы
- команды и инструменты системного администратора
Поиск по руководствам
[править]В примере выше в поле SEE ALSO обнаружились ссылки на руководства по less, groff (программе форматирования страницы руководства), структуре конфигурационного файла для man, а также по двум сопутствующим командам с такими говорящими названиями «apropos» и «whatis». Как и команда apropos, whatis ищет подстроку в некоторой базе данных, состоящей из полей NAME всех страниц помощи в системе. Различие между ними в том, что whatis — только среди имен объектов (в левых частях полей NAME), а apropos — по всей базе. В результате у whatis получается список кратких описаний объектов с именами, включающими искомое слово, а у apropos — список, в котором это слово упоминается. Для того, чтобы это узнать, все равно пришлось один раз прочесть документацию.
Описания объектов, выводимые whatis или apropos, отличаются числом в скобках — номером раздела:
user@desktop ~ $ whatis passwd
passwd (1) - update a user's authentication tokens(s)
passwd (5) - password file
passwd (8) - manual page for passwd wrapper version 1.0.5
Программа 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 систем остаются страницы руководств.
Резюме
[править]Командная строка UNIX является основным средством работы администратора системы. Это происходит еще и потому, что в настоящее время широко распространены средства удалённой работы с системой через сетевые терминалы.
Интерфейс командной строки состоит из специального устройства терминала, который инкапсулирует особенности физических устройств ввода и вывода информации, и командной оболочки — специального процесса, который отвечает за интерактивную работу пользователя, исполняет команды и т. п..
Командная строка имеет строго определённый формат и состоит из приглашения и команды. Команда может иметь параметры и аргументы. Каждая команда возвращает специальный код завершения. Несколько команд могут быть объединены в одну.
Каждый процесс имеет свое программное окружение, которое достаётся ему в наследство от родительского процесса. Окружение состоит из переменных, среди которых выделяют ряд стандартных.
Современные командные оболочки (в частности, bash) имеют ряд дополнительных удобных возможностей интерфейса пользователя, например, псевдонимы, автодополнение, шаблоны имен и встроенные средства программирования.
В UNIX существует огромное количество документации, основная часто которой сосредоточена в страницах руководств (man). Также выделяют расширенные руководства (info) и документацию, поставляемую с программой (которую можно найти в директории /usr/share/doc).
Ключевые термины:управляющие символы, терминал, управляющая последовательность, командная строка, командная оболочка, виртуальная консоль, графический терминал, тип терминала, приглашение, имя команды, встроенная команда, параметры команды, аргументы команды, перенаправление ввода-вывода, код завершения, конвейер, служебные символы, окружение, переменная окружения, история команд, псевдоним, шаблон, страница руководства
Дополнительные материалы
[править]- Д. Тейнсли Linux и UNIX: программирование в shell. Руководство разработчика. — К.: Издательская группа BHV, 2001. — 464 с.: ил.
- Курячий Г. В., Маслинский К. А. Операционная система Linux. — М.: Интуит. Ру, 2005. — 392 с.: ил.
- Курячий Г. В. Операционная система UNIX. — М.: Интуит. Ру, 2004. — 292 с.: ил.
- Соловьёв А. Программирование на shell. — http://www.linuxcenter.ru/lib/books/shell/
Вопросы
[править]- Что такое терминал? Какие бывают терминалы?
- Командная строка UNIX: из каких частей состоит, основные управляющие клавиши, примеры команд?
- Что такое командная оболочка? Что происходит при запуске команды?
- Какие существуют способы объединения команд? Чем они отличаются?
- Что такое программное окружение? Какие стандартные переменные окружения существуют в UNIX?
- Что входит в справочную систему 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 – ИЛИ, \! – НЕ, \(...\) – группа условий.
- К найденым файлам могут применяться следующие действия:
- Вывести на экран имя найденного файла вместе с путём. Это действие выполняется по умолчанию.
- -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
Дополнительные материалы
[править]- Курячий Г.В., Маслинский К.А. Операционная система Linux. – М.: Интуит.Ру, 2005. – 392 с.: ил.
- Курячий Г.В. Операционная система UNIX. – М.: Интуит.Ру, 2004. – 292 с.: ил.
- Рейчардс К., Фостер-Джонсон Э. 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 для нахождения информации в файлах.
Задания для самоподготовки
[править]- Создайте каталог test1 в домашней директории. Сравните время создания системных каталогов /bin, /tmp с каталогом test1.
- Скопируйте файл /bin/ls в локальную директорию. Посмотрите атрибуты этого файла. Попробуйте запустить его.
- Создайте в локальной директории символическую ссылку tmplnk на директорию /tmp. Скопируйте несколько файлов в директрию tmplnk.
- Сравните файлы /dev/tty1 и /dev/hda1. Какой тип они имеют? Чем они отличаются?
- Найдите все файлы в системе, которые были модифицированы не более суток назад.
- С помощью одной команды найдите все файлы с расширением .html в директории /usr и скопируйте их в локальную папку htmls.
- Создайте архив директории /etc и узнайте его размер. Попробуйте создать сжатый архив той же папки. Сравните степень сжатия gzip и bzip2 на этом примере.
- Создайте текстовый файл a.txt из десяти строк. Узнайте его размер. Создайте новый файл, содержащий в себе файл a.txt четыре раза.
- С помощью одной команды найдите все файлы с расширением .txt в директории /usr и объедините их в один большой файл big.txt.
- Получите с помощью одной команды файл, содержащий все числовые идентификаторы пользователей, зарегистрированных в ситсеме.
- Получите с помощью одной команды строки с 5-ой по 8-ю в файле /proc/cpuinfo, содержащем информацию о процессоре.
- Придумайте регулярное выражение, соответствующее URL с использованием протокола http. Найдите все строки, содержащие такие URL в файлах директории /etc.
- С помощью одной команды найдите все файлы с расширениями .txt или .html в директории /usr, в которых содержится слово user.
Сценарии практического занятия на тему: Работа с файлами в UNIX
[править]«Сценарий: Знакомство с каталогами UNIX»
pwd
cd /
ls
ls -F --color
ls -F --color ~
cd
mkdir test
ls -F --color
mkdir test/subtest
ls -F --color -R
«Сценарий: Изучение типов файлов в UNIX»
touch test/first.txt
echo "Hello, world" >> test/first.txt
cat test/first.txt
ls
ls -F --color -l test
alias ls='ls -F --color -l'
ls -a -i test
cd test
cp first.txt copy1.txt
mv first.txt orig.txt
mv first.txt orig.txt
ln orig.txt copy2.txt
ln -s orig.txt orig.lnk
«Сценарий: Поиск системных журналов»
cd test
find
find -name "o*"
find /etc -name "o*"
find /etc -name "o*" -a -type f
find /var -name "*log" -a -type f 2>/dev/null
mkdir test/logs
find /var -name "*log" -a -type f -exec cp {} test/logs/ 2>/dev/null
«Сценарий: Архивирование и деархивирование файлов и директорий»
cd
tar -czf test.tar.gz test
mkdir test2
cd test2
tar -xzf ../test.tar.gz
ls -l -F
«Сценарий: Cоздание новых текстовых файлов»
echo "One line"
echo "One line" > second.txt
echo "A line" >> second.txt
cat second.txt
cat >multiline.txt
cat multiline.txt
cat orig.txt second.txt multiline.txt > big.txt
cat big.txt
«Сценарий: Разрезание и склеивание файлов»
cat /etc/passwd
cat /etc/passwd | cut -f1 -d:
cat /etc/passwd | cut -f1 -d: | sort
cat /etc/passwd | cut -f7 -d:
cat /etc/passwd | cut -f7 -d: | uniq
cat /etc/passwd | cut -f7 -d: | sort | uniq
cat /etc/passwd | cut -f1 -d: > users
cat /etc/passwd | cut -f7 -d: > shells
paste users shells
«Сценарий: Быстрый анализ текстов»
wc -l /etc/passwd
cat users | wc -w
head logs/Xorg.0.log
tail logs/Xorg.0.log
«Сценарий: Поиск строк по регулярным выражениям»
less test/log/XFree86.0.log
grep "^(WW)" test/log/XFree86.0.log
grep "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
grep -h "[a-zA-z0-9]\+@[a-zA-z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
grep -ho "[a-zA-Z0-9]\+@[a-zA-Z0-9\.]\+\.[a-z]\{2,4\}" /etc/* 2>/dev/null
find /etc -type f 2>/dev/null
find /etc -type f -exec grep "nameserver" {} \; 2>/dev/null
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
Дополнительные материалы
[править]- Курячий Г.В., Маслинский К.А. Операционная система Linux. – М.: Интуит.Ру, 2005. – 392 с.: ил.
- Курячий Г.В. Операционная система UNIX. – М.: Интуит.Ру, 2004. – 292 с.: ил.
- Рейчардс К., Фостер-Джонсон Э. 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
Простые пользователи не могут повышать приоритет процессов, только понижать.
Задания для самоподготовки
[править]- Сравните время создания корневой директории с текущим временем системы.
- Получите список всех типов файловых систем, примонтированных в настоящий момент. Какой тип имеет корневая файловая система?
- Найдите три процесса, использующих самый большой объём памяти. Какой процент памяти они потребляют от общего объёма?
- Получите иерархию родительских процессов для текущей командной оболочки.
- Найдите, в каком файле в директории /proc хранится информация о системной памяти.
- С помощью сигнала остановки процесса и команды bg запустите три параллельных процесса архивации директории /etc, /home и /tmp.
Сценарии практического занятия на тему: Сбор сведений о системе и управление процессами
[править]«Сценарий: Сбор сведений о системе»
uname -a
ls /proc
who
mount
df -h
ps aux
ps aux | grep -v user
pstree
top
«Сценарий: Управление процессами с помощью сигналов»
yes
find / > files.txt
ps aux | grep find
kill 8178
kill 1
killall bash
killall -SIGKILL find
«Сценарий: Выполнение задач в фоновом режиме»
find / > files.txt
jobs
fg 1
bg 1
find / -name "*.xml" > xml-list &
«Сценарий: Запуск демонов»
find / -name "*.html" -exec grep -Hn "linux loader" \{} \; &
exit
nohup find / -name "*.txt" -exec grep -Hn "linux loader" \{} \; &
«Сценарий: Изменение приоритетов выполняющихся программ»
ps -l
nice -n 10 tar -cjf libraries.tar.bz2 /usr/lib/
tar -cjf libraries.tar.bz2 /usr/lib &
renice +10 -p 3442