Глава 16. Введение в оболочки
После изучения основных команд Unix, полезно освоить среду командной строки, в которой эти команды используются, - оболочку. Оболочка аналогична окну DOS в системе Windows 3.1 или Windows 98, в котором можно вводить команды, запускать программы и выполнять операции с файлами.
В отличие от окон DOS, представляющих собой среду с ограниченной гибкостью, оболочки Unix - это небольшие программы, запускаемые как процессы при входе в систему и обеспечивающие богатый набор средств в соответствии с потребностями различных пользователей и программ.
В мире Unix - следовательно, и Linux - большой выбор оболочек, каждая из которых имеет собственный набор средств и возможностей, зачастую и собственный язык сценариев для создания сложных, самостоятельно выполняемых, программ, аналогичных bat-файлам DOS (с привычным расширением . ВАТ), но более мощным. »
В начале главы дан обзор основных оболочек Unix, в том числе Bourne Shell, С Shell и Korn Shell, затем мы перейдем к углубленному изучению оболочки Bourne Again Shell, известной как Bash, устанавливаемой по умолчанию в большинстве дистрибутивов Linux.
Обзор оболочек
Оболочка ранних версий Unix была довольно примитивной, без хронологического списка, средств редактирования командной строки и управления заданиями. Однако в семидесятые годы, с появлением Bourne Shell и С Shell, оболочки стали превращаться в объекты серьезного внимания в мире Unix. Сейчас пользователям Unix предлагается на выбор множество оболочек, каждая из которых имеет уникальный набор средств.
Существует два основных семейства оболочек. Одно из них берет начало от оболочки Bourne Shell, другое - от С Shell. Прежде чем приступить к основательному изучению оболочки Bourne Again Shell, устанавливаемой по умолчанию в большинстве дистрибутивов Linux, рассмотрим основные оболочки Unix.
Совет
Чтобы быть в курсе новейших разработок в области оболочек Unix, подпишитесь на группу новостей сотр.unix.shell.
Bourne Shell (sh)
Bourne Shell (sh) считается исходной оболочкой Unix. Во многих отношениях эта довольно ограниченная оболочка, в которой недостает таких средств, как хронологический список или редактирование командной строки. Но многие средства Bourne Shell, именно как исходной версии, входят в ряд современных оболочек. Пример - основной набор команд. В современных системах Bourne Shell, как оболочка по умолчанию, применяется редко. В большинстве дистрибутивов Linux установлены Bourne Again Shell или Enhanced С Shell.
Оболочка Bourne Shell - источник множества концептуальных новшеств: например, проверки успешного или аварийного завершения работы программ, что позволяет писать сложные сценарии. Теперь это средство - стандарт оболочек Unix.
С Shell (csh)
С Shell (csh) - ранняя оболочка Unix с набором команд и языком сценариев на основе синтаксиса популярного языка программирования С. Как и в ранней Bourne Shell, в С Shell отсутствуют некоторые важные функции, наподобие редактирования командной строки. Однако в этой оболочке впервые реализовано несколько важных идей, например, алиасы команд и хронологические списки. Усовершенствованный вариант Enhanced С Shell (tcsh) с редактированием командной строки и другими функциями, позаимствованными из Bash, входит в большинство дистрибутивов Linux как альтернативная оболочка.
Оболочка С Shell известна рядом концептуальных нововведений, вошедших даже в оболочки, производные от Bourne Shell. Среди прочих, идея реализации в оболочке некоторых арифметических функций и сравнительной проверки. В Bourne Shell для этого требовалось обращение к внешним программам.
Bourne Again Shell (bash)
Это оболочка, устанавливаемая в дистрибутивах Linux чаще других. Известная как Bash, она является производной от Bourne Shell (что следует из названия), но имеет дополнительные функции: редактирование командной строки, хронологический список и дополнение частично введенных имен файлов. В Bash можно писать сложные сценарии на синтаксисе, близком к синтаксису Bourne Shell. Поскольку в настоящее время Bash - наиболее распространенная оболочка Linux, большая часть главы посвящена именно ей. Она же подразумевается во всех примерах, приводимых в книге.
Коm Shell (ksh)
Еще одна оболочка, производная от Bourne Shell. По некоторым оценкам, это наиболее популярная оболочка Unix, но в дистрибутивах Linux она редко устанавливается по умолчанию. Оболочка Korn Shell была, вероятно, одной из первых, в которой впервые появилось множество популярных функций, реализованных в настоящее время в Bash, в том числе редактирование командной строки. Она же помогла перенести в мир Bourne Shell многие функции, введенные в С Shell.
Другие оболочки
Существует множество других оболочек, каждая из которых обеспечивает интерфейс командной строки, обладающий уникальными свойствами. Но ни одна из них не завоевала достаточной популярности, чтобы быть включенной в большинство дистрибутивов Linux. Среди них можно упомянуть Adventure Shell (ash), представляющую подмножество Bourne Shell, полностью перепрограммируемую Extensible Shell (es), эргономичную ERGO Shell (esh), Z Shell (zsh), объединившую, подобно оболочке Bash, функции многих оболочек, что, в конце концов, привело к некоторому подобию Korn Shell.
Совет
Превосходным источником альтернативных оболочек для системы Linux служит архив Linux SunSite с каталогом оболочек ftp://metalab.unc.edu/pub/Linux/system/sheiIs .
Здесь можно найти все распространенные оболочки, а также и малоизвестные ish, pash или pdksh.
Эксперименты с различными оболочками
Вероятно, вам уже интересно, как опробовать все эти оболочки, не устанавливая каждую по умолчанию. Оболочка запускается как обычная программа в среде оболочки по умолчанию. Например, Enhanced С Shell устанавливается при установке системы, но по умолчанию всеми пользователями используется Bash. Чтобы запустить Enhanced С Shell, введите следующую команду.
$ tcsh
В этой команде подразумевается, что программа tcsh находится в одном из каталогов пути по умолчанию, в противном случае придется указывать путь к оболочке, например /bin/ tcsh. После ввода команды запускается оболочка Enhanced С Shell, и работа продолжается уже в среде ее командной строки. Возврат в оболочку по умолчанию происходит после ввода команды exit.
В большинстве систем Linux есть.символическая ссылка /bin/sh на /bin/tcsh, так что оболочку Enhanced С Shell можно запустить следующей командой.
$ csh
Этим методом можно воспользоваться для проверки различных оболочек, прежде чем установить одну из них по умолчанию. Чтобы сменить оболочку по умолчанию, устанавливаемую при входе в систему, необходимо внести изменения в одну из записей файла паролей Unix, введя команду chsh.
Представьте ситуацию, в которой пользователь someuser работает с установленной по умолчанию оболочкой /bin/bash (Bourne Again Shell). Соответствующая запись в файле паролей имеет примерно следующий вид.
someuser::790:103:Some User:/home/someuser:/bin/bash
В ее конце указана оболочка по умолчанию /bin/bash. После ввода команды
$ chsh -a /bin/tcsh someuser
оболочка по умолчанию меняется на /bin/tcsh, и запись в файле паролей становится следующей:
someuser::790:103:Some User:/home/someuser:/bin/tcsh
При следующем входе в систему вместо оболочки Bourne Again Shell будет запущена Enhanced С Shell.
Оболочка Bash
Рассмотрим наиболее популярную оболочку Linux - Bash. Для понимания ее места в мире Linux важно понять сам процесс входа в систему. В результате ввода имени и пароля пользователя происходит несколько важных процессов. Прежде всего, запуск оболочки (в нашем случае Bash), затем - считывание конфигурационного файла, созданного для создания собственной среды Bash.
Чтобы обеспечить персонифицированную конфигурацию Bash, необходимо создать в исходном каталоге файл с именем .bashrc. Это простейший текстовый файл, выполняемый оболочкой Bash при ее запуске (обычно при входе в систему).
Примечание
В Red Hat Linux 7.1 параметры персонифицированной конфигурации входят также в состав файла .bash_prof lie, который хранится в исходном каталоге пользователя.
Файл . bashrc может содержать любой разрешенный набор команд и функций оболочки Bash, которые можно вводить в командной строке, а также сложные команды, применяемые в сценариях.
Именно в файле .bashrc конфигурируются параметры оболочки, устанавливаются переменные среды (например, путь по умолчанию) и запускаются программы, предназначенные для автоматического запуска с оболочкой Bash. Ниже приведены команды, образующие простой файл . bashrc, который задает оригинальную подсказку командной строки, устанавливает алиас команды с именем which и некоторые переменные среды.
PS1=" [\u@\h \W]\\$ " alias which="type -path" export PATH=$PATH:.:~/bin export EDITOR=emacs
В этом простом примере задействованы несколько важных функций оболочки Bash.
Установка переменных среды в Bash
У каждой оболочки свой синтаксис установки переменных среды. Обычно в Bash это выполняется в два этапа: присвоение переменной значения и экспорт переменной в среду. Например, чтобы задать по умолчанию текстовый редактор emacs, можно присвоить переменной среды EDITOR значение emac s:
$ EDITOR=emacs
затем экспортировать ее следующей командой.
$ export EDITOR
Обе команды можно объединить в одну.
$ export EDITOR=emacs
При рассмотрении подстановочных символов мы покажем, что на значение переменной среды можно сослаться, указав символ "$" как префикс имени этой переменной в командной строке Bash. Так можно дополнять значение переменной среды. Например, если переменная пути по умолчанию PATH равна
/bin:/usr/bin:/usr/X11R6/bin
к ней можно добавить составляющую /usr / local/bin, введя следующую команду.
$ export PATH=$PATH:/usr/local/bin
В этой команде текущее значение переменной PATH представлено выражением $РАТН. Новое значение переменной следующее:
/bin:/usr/bin:/usr/X11R6/bin:/usr/local/bin
Переадресация ввода и вывода
Одна из наиболее полезных концепций в мире Unix - стандартный ввод/вывод. Невзаимодействующие программы могут получать данные от стандартного устройства ввода, как правило, клавиатуры. Результаты выводятся на стандартное устройство вывода (обычно, это экран). ,
Однако в большинстве оболочек предусмотрена возможность переадресации стандартного ввода или вщвода, что позволяет создавать сложные командные конструкции на основе большого количества команд и файлов данных. В гл. 13 мы рассмотрели конвейеризацию команд, при помощи которой можно переадресовать стандартный вывод на стандартный ввод. Например, в команде
$ ls -1 | more
результаты выполнения команды Is -1 направляются не на стандартное устройство вывода, а на стандартный ввод команды more.
Другой способ переадресации стандартного ввода/вывода в оболочке Bash - при помощи символов переадресации "<" и ">". Рассмотрим ситуацию, когда надо записать в файл список содержимого каталога. Для этого можно воспользоваться следующей командой.
$ ls -1 > filelist
По этой команде стандартный вывод команды Is -1 будет переадресован в файл с именем filelist. В следующей команде происходит переадресация ввода.
$ mail user@juxta.com < filelist
Здесь файл filelist используется в качестве стандартного устройства ввода для команды mail, образуя текст сообщения электронной почты.
Дополнение частично введенных имен
Это простое, но очень полезное средство, действующее следующим образом. Если набрать в командной строке достаточное число символов, чтобы указать уникальное имя файла, команды или каталога, то Bash может дополнить недостающую его часть. Предположим, вы набрали
$ /usr/lo
В большинстве систем этого достаточно для идентификации единственного объекта - каталога /usr/local/. Нажмите клавишу Tab, и Bash попытается дополнить недостающую часть имени. Если существует единственный объект (файл, каталог или команда) с именем, начинающимся с /usr/lo, то Bash дополнит это имя. В нашем случае до /usr/local/.
Конечно, в некоторых случаях введенной части имени недостаточно для определения единственного объекта. Тогда Bash выводит список возможных имен. Например, если набрать
$ /usr/1
это может соответствовать /usr/local/ или /usr/lib/. Если нажать клавишу Tab, оболочка Bash будет не в состоянии выбрать единственный вариант и выдаст список всех возможных.
lib local
Пользователь может набрать еще несколько символов и снова нажать Tab. В данном примере достаточно набрать "о". После нажатия клавиши Tab Bash дополнит имя до /usr/local / .
Вероятно, вам не дает покоя вопрос: что произойдет, если набрать неполное имя файла, находящегося в локальном каталоге или любом другом, включенном в путь по умолчанию, без указания полного пути? Сможет ли Bash дополнить его? Ответ - да. При дополнении имени файла или каталога, указанных без полного пути, как в команде
Bash проводит поиск имен, совпадающих с введенной частью строки, в каталогах, указанных в пути по умолчанию. В большинстве систем для дополнения указанной команды найдется лишь несколько имен, в том числе grep и groff , так что предложенный список возможных вариантов будет выглядеть примерно так:
grep groff grotty
Чтобы выбрать команду grep, достаточно набрать букву "е" и нажать Tab.
Алиас команды
Установка алиасов (псевдоимен) команд - мощное средство, позволяющее пользователю создавать собственные команды. Например, частые проверки всех процессов в системе можно проводить при помощи следующей команды.
$ ps -aux | more
Чтобы не набирать каждый раз довольно длинную команду, можно определить ее алиас. Допустим, мы ходим создать алиас с именем psa для проверки всех выполняемых процессов. Это можно сделать командой
$ alias psa="ps aux | more"
После этого ввод в командной строке Bash команды psa будет аналогичен вводу ps aux | more. Алиас остается в памяти до конца текущего сеанса оболочки Bash. После выхода из оболочки все алиасы теряются.
Чтобы алиасы не утрачивались с окончанием сеансов, их следует определять в файле . bashrc, аналогично тому, как ранее мы устанавливали текстовый редактор по умолчанию emacs.
Применение алиасов позволяет не только облегчить работу с командной строкой, но и избежать множества опасных ошибок. Например, если войти в систему как корневой пользователь, становятся опасными самые простые операции копирования, перемещения или удаления файлов и каталогов. Любая ошибка может привести к удалению файлов, каталогов и даже файловых систем, причем виновник может этого не заметить. Поэтому в оболочке Bash учетная запись корневого пользователя конфигурирована с установкой по умолчанию следующих алиасов.
alias cp='cp -i' alias mv='mv -i' alias rm='rm -i '
Флажок -i указывает на необходимость подтверждения удаления или перезаписи файлов во всех трех операциях. Отменить действие флажка - i можно только установкой другого флажха i например, rm - f ).
Редактирование командной строки
Одна из возможностей Bash, отсутствовавшая в более ранних оболочках (Bourne Shell или С Shell) - редактирование командной строки. Без этого допущенную в наборе команды ошибку можно было исправить, только удалив все символы после нее. Например, если в команде
$ /usr/kocal/bin/mycommand
ошибочно набрано "kocal" вместо "local", то вернуть курсор к "k" можно только удалив все последующие символы, которые придется набрать вновь после исправления ошибки. Надо ли объяснять, насколько это неэффективно!
В современных оболочках, в том числе и Bash, предусмотрен полный набор средств редактирования командной строки. Курсор можно перемещать по строке при помощи клавиш со стрелками, при необходимости удаляя или вставляя символы. Ввод команды нажатием клавиши Enter можно выполнять, не перемещая курсор в конец строки. По умолчанию, командная строка Bash находится в режиме вставки, так что набираемые символы не замещают существующие, а вставляются между ними.
Чтобы ускорить редактирование командной строки, особенно при наборе длинных команд, в Bash предусмотрено несколько функциональных комбинаций клавиш, перечисленных в табл. 16.1.
Табл. 16.1. Функциональные комбинации клавиш для редактирования командной строки
Комбинация клавиш |
Функция |
Ctrl+A |
Переход в начало строки |
Ctrl+E |
Переход в конец строки |
Ctrl+B |
Переход на один символ влево |
Ctrl+F |
Переход на один символ вправо |
Esc, В |
Переход на одно слово влево |
Esc,F |
Переход на одно слово вправо |
Ctrl+L |
Очистка экрана с выводом командной строки вверху |
Ctrl+D |
Удаление символа в текущей позиции курсора |
Backspace |
Удаление символа слева от курсора |
Ctrl+T |
Поменять местами символ в позиции курсора с символом слева от него |
Esc, Т |
Поменять местами слово в позиции курсора со словом слева от него |
Esc, U |
Перевод текущего слова в верхний регистр |
Esc.L |
Перевод текущего слова в нижний регистр |
Esc, С |
Перевод текущего слова в нижний регистр с заглавной первой буквой |
Ctrl+K |
Удаление символов от позиции курсора до конца строки |
Тот, кто работает в редакторе emacs, сразу обратит внимание, что в приведенной таблице перечислены функциональные комбинации клавиш именно этого редактора. Действительно, набор функциональных клавиш оболочки Bash позаимствован из emacs. Можно установить альтернативный набор из редактора vi, но последний, как и его набор функциональных клавиш, менее популярен среди программистов и опытных системных администраторов, поэтому в данной книге не рассматривается.
Список команд из табл. 16.1 - лишь незначительная часть всех команд редактирования, предоставляемых оболочкой Bash. Однако это основные функции, необходимые большинству пользователей для эффективной работы. Более подробный список функций редактирования можно найти в разделе HEADLINE страницы руководства оболочки Bash, для вывода которой необходимо ввести в командной строке man bash.
Хронологический список
Идея, положенная в основу этого средства, крайне проста. После ввода каждой команды (после нажатия Enter, а не Ctrl+C), последняя заносится в список, из которого команды можно извлекать в порядке, обратном вводу.
Простейший способ доступа к хронологическому списку - просмотр его записей нажатием клавиши со стрелкой вверх, пока не будет найдена нужная команда. У хронологического списка есть два основных назначения: поиск ошибочно введенных команд и повторный ввод команд.
Рассмотрим первое. Предположим, вы предприняли попытку просмотреть содержимое файла testf ile, для чего ввели команду
$ moer testfile
После нажатия Enter, на экране появится сообщение об ошибке.
bash: moer: command not found.
Для быстрого исправления ситуации достаточно вернуть команду в командную строку нажатием клавиши со стрелкой вверх, исправить moer на more (воспользовавшись функциями редактирования командной строки) и нажать Enter.
Другая ситуация - конфигурирование некоторой программы. При этом обычно приходится несколько раз подряд редактировать конфигурационный файл и запускать программу. А для таких повторов нет средства лучше хронологического списка.
Существует быстрый способ доступа к хронологическому списку - при помощи восклицательного знака (!). Если ввести восклицательный знак с несколькими следующими за ним начальными буквами одной из команд из хронологического списка, то эта команда будет выполнена (будет повторено последнее обращение к ней).
Например, если ранее была выполнена команда
$ ps aux | grep httpd | more
ее выполнение можно повторять вводом
$ !ps
если только после нее не вводилась другая команда, начинавшаяся с "ps". После ввода ! ps выполняется последняя команда из хронологического списка, начинающаяся с "ps".
Для хронологического списка также существует ряд полезных функциональных комбинаций клавиш. Некоторые из них перечислены в табл. 16.2.
Из перечисленных комбинаций наиболее интересна Ctrl+R. Это динамичный, интерактивный обратный поиск в списке. По мере набора строки Bash ищет в хронологическом списке команду с совпадающим фрагментом, введенную последней. Чем длиннее набранная строка, тем меньше область поиска нужной команды.
Предположим, необходимо ввести уже вводившуюся сложную поисковую команду. Включите режим поиска, нажав Ctrl+R. На экране появится строка интерактивного поиска.
(reverse-i-search)' ':
Табл. 16.2. Функциональные комбинации клавиш для хронологического списка
Комбинация клавиш |
Функция |
Ctrl+P Ctrl+N Esc, < Esc,> Ctrl+R
Ctrl+O |
Переход к предыдущей команде в хронологическом списке Переход к следующей команде в хронологическом списке Переход к началу хронологического списка (команде, введенной первой) Переход в конец хронологического списка (к команде, введенной последней) Поиск по списку в обратном направлении Выполнение текущей команды хронологического списка и вывод ( следующей для редактирования или выполнения |
По мере набора символов в этой строке Bash отыскивает в хронологическом списке команду с совпадающим фрагментом, введенную последней. Например, набор одной буквы "f" может дать следующий результат.
Наконец, после набора "fin", получаем то, что искали:
(reverse-i-search)`fin': find / -name 'foo' -print
Для ввода найденной команды достаточно нажать Enter.
Управление заданиями
Для многозадачной системы, каковой и является Linux, функция управления заданиями особенно важна, так как позволяет управлять несколькими программами, выполняемыми одновременно в одной оболочке.
Как правило, введенная команда выполняется в режиме переднего плана. Это означает, что подсказка командной строки возвращается на экран только после того, как завершится выполнение команды. Интерактивные программы, наподобие emacs, захватывают экран или окно, в котором запущена оболочка, и возвращают их командной строке только после завершения работы. Неинтерактивные программы, например find, не захватывают экран; тем не менее, и в этом случае подсказка командной строки возвращается на экран только после завершения программы.
Предположим, вы ввели следующую команду.
$ find / -name '*.tmp' -print > templist
Это команда поиска во всех каталогах системы Linux файлов с расширением . trap и вывода результатов поиска на стандартное устройство вывода. Вывод переадресован в файл templist для последующей обработки. Это означает отсутствие какого-либо вывода на экран. Тем не менее, ввести другую команду до окончания поиска не удастся.
Такая ситуация противоречит идее многозадачности. Необходим способ, с помощью которого можно было бы после ввода команды поиска, не дожидаясь ее завершения, запустить другую программу.
Решить задачу помогает запуск программ в фоновом режиме. Если запускать задания в фоновом режиме, подсказка командной строки будет оставаться на экране, а новые задания можно будет запускать, не дожидаясь завершения уже запущенных.
Простейший способ запуска задания в фоновом режиме - завершение команды запуска знаком амперсанда (&). Этот знак заставляет оболочку запускать команду в фоновом режиме с незамедлительным возвратом подсказки командной строки на экран. Приведенная ранее команда поиска, выполняемая в фоновом режиме, будет иметь вид:
$ find / -name '*.tmp' -print > templist &
Сразу после нажатия Enter на экран возвратится подсказка командной строки. Одновременно начнется выполнение команды поиска.
Чтобы получить список заданий, выполняемых в фоновом режиме, введите команду j obs оболочки Bash. Результат ее выполнения будет примерно следующим.
$ jobs
[1]+ Running find / -name ' *.tmp' -print >templist &
Итак, ответ команды показывает, что в системе выполняется одно задание, что выполняется оно в фоновом режиме (о чем свидетельствует знак "&"), и что это команда find / -name ' * . tmp' -print >templist &.
Если в фоновом режиме выполняется несколько заданий, то результат может выглядеть иначе.
[2]+ Running ls -1R / >dirlist &
Если программа запущена в режиме переднего плана, ее можно перевести в фоновый режим. Комбинация клавиш Ctrl+Z интерпретируется оболочкой Basfi как команда временной остановки текущего процесса. Например, если команду поиска из предыдущего примера запустить в режиме переднего плана, то после нажатия Ctrl+Z поиск временно прекращается. Если теперь ввести команду j obs, результат будет следующим.
[1]+ Stopped find / -name '*.tmp' -print >templist
Обратите внимание: теперь в столбце состояния указано Stopped (остановлено) вместо Running (выполняется). Это задание можно перевести в фоновый режим следующей командой,
$ bg 1
где единица указывает номер задания. Выполняя одно задание, его номер можно не указывать.
$ bg
После того, как остановленное задание переводится в фоновый режим его выполнение возобновляется, и команда j obs показывает его состояние как Running.
Иногда возникает необходимость приостановить задание без перевода в фоновый режим. К примеру, при работе в текстовом редакторе emacs (или любом другом) может понадобиться ввести одну или несколько команд, затем опять вернуться в редактор. Чтобы не выходить полностью из редактора, приостановите его работу, нажав Ctrl+Z, введите требуемые команды и вновь вернитесь к работе. Интерактивные программы плохо приспособлены к выполнению в фоновом режиме, поэтому лучше держать их остановленными до возврата к работе в режиме переднего плана.
Возврат остановленного или переведенного в фоновый режим задания в режим переднего плана происходит по команде fg. Так, остановленный в предыдущем примере редактор emacs возвращается к работе в режиме переднего плана командой
$ fg
При наличии нескольких остановленных или выполняемых в фоновом режиме заданий необходимо указать номер задания, переводимого в режим переднего плана. Если задание emacs имело номер 2, то команда его перевода в режим переднего плана будет следующей.
$ fg 2
Наконец, в некоторых случаях остановленное или фоновое задание приходится завершать либо уничтожать. Для уничтожения процесса, указанного его идентификатором (РШ), используется команда kill. Можно воспользоваться командой ps для определения идентификатора процесса (см. страницу руководства этой команды) либо уничтожать остановленные или фоновые задания непосредственно по их номерам.
Например, при наличии в системе двух фоновых заданий, когда команда j obs выводит на экран:
[3]+ Stopped emacs somefile
уничтожение задания ls производится командой $ kill %2
Обратите внимание на знак процента перед номером задания. Без него команда пыталась бы уничтожить процесс с идентификатором PID, равным 2. Необходимо различать номер процесса и идентификатор РШ, поскольку это вещи абсолютно разные.
Рассмотрим следующий пример. Имея один фоновый процесс, вы запускаете второе задание. Система тут же присваивает ему идентификатор PID, представляющий численное значение, например 100, 999 или 25 678. Малые значения PID. (особенно, меньше 100) применяются для обозначения всевозможных системных процессов, запускаемых одновременно с загрузкой Linux и выполняемых до выключения компьютера. Следовательно, совпадение идентификатора PID и номера задания весьма маловероятно.
Подстановочные символы
Одно из мощных средств современных оболочек (в том числе Bash) - подстановочные символы, позволяющие задавать несколько имен команд или файлов в одном выражении. Рассмотрим простой пример. Если ввести команду,
$ ls -1
ответом на нее будет полный список файлов текущего каталога. Предположим, что нам надо найти файл, о котором известно только то, что его имя начинается на букву "z". Введем команду,
$ Is -1 z*
в которой аргумент z * означает все файлы, имена которых начинаются на букву "z". Пользователям DOS или Windows такое применение звездочки, вероятно, знакомо. После ввода команды оболочка Bash составляет список всех файлов, имена которых начинаются на "z" и заменяет аргумент z * этим списком. Имена файлов из списка передаются в качестве аргументов команде Is -1. В оболочке Bash возможности подстановочного символа "*" значительно шире, чем в DOS или окне DOS системы Windows.
Подстановочные символы в обозначении каталогов и файлов
Одно из применений подстановочных символов - обозначение каталогов и файлов. Здесь, кроме звездочки, применяются еще два символа. Все символы, а также их значения, перечислены в табл. 16.3.
Табл. 16.3. Применение подстановочных символов в обозначении каталогов и файлов
Символ |
Описание |
? [...] [A-F] [ .. .] или [!...] [ A A-F] или [IA-F] |
Любой единичный символ Любой единичный символ, заключенный в скобки Любой единичный символ, попадающий в указанный диапазон Любой единичный символ, кроме заключенных в скобки Любой единичный символ, не попадающий в указанный диапазон |
Рассмотрим несколько примеров.
Предположим, надо составить список всех файлов с именами длиной в три символа, первый из которых "а", а последний - "z". Это можно сделать, введя команду
$ Is -1 a?z
Если заменить вопросительный знак звездочкой, получим список файлов, имена которых просто начинаются на "а" и оканчиваются "z".
$ Is -I a*z
Вопросительный знак обозначает один произвольный символ, звездочка - любое их количество, включая нуль.
Рассмотрим ситуацию, когда необходимо получить список файлов, имена которых начинаются на а, Ь, с или d._ Для этого можно воспользоваться следующей командой.
$ Is -1 а* Ь* с* d*
Однако такая форма несколько громоздка. Гораздо удобнее воспользоваться следующей: $ Is -I [abed]*
Выражение в квадратных скобках означает любую из перечисленных букв, звездочка - любое число следующих за ней произвольных символов.
Поскольку перечисленные буквы образуют непрерывную последовательность, команду можно упростить:
$ Is -I [a-d]*
Наконец, иногда необходимо исключить один или несколько символов, включив все остальные, Рассмотрим создание сжатого архива всех исходных каталогов системы. Предположим, нужно архивировать все каталоги кроме тех, имена которых начинаются с буквы "m". Для этого можно воспользоваться командой,
$ tar czvf home.tar.gz /home/[a-1]* /home/[n-z]*
но гораздо удобнее следующая форма этой же команды:
$ tar czvf home.tar.gz /home/[!m]*
Здесь выражение в квадратных скобках обозначает любой символ, кроме буквы "m".
Можно усложнить задачу, исключив архивирование каталогов, имена которых начинаются с букв m, n или о. Соответствующая команда будет иметь вид
$ tar czvf home.tar.gz /home/[^mno]*
или
$ tar czvf home.tar.gz /home/[!m-o]*
Фигурные скобки
Подстановочные символы в фигурных скобках имеют те же свойства, но применимы к именам, не обязательно связанным с существующими файлами или каталогами. Рассмотрим пример команды с выражением в фигурных скобках.
$ mkdir testdir{1,2,3,4}
По этой команде создаются четыре каталога с именами testdirl, testdir2, testdir3 и testdir4.
Обратите внимание, что элементы выражения в фигурных скобках разделены запятыми, и все они используются последовательно для образования нужных имен. Разделение элементов запятыми предполагает, что они, в отличие от элементов в квадратных скобках, могут содержать более одного символа, например:
$ mkdir testdir{01,02,03,04}
Следует учитывать, что выражение в фигурных скобках должно содержать минимум одну запятую.
Интересно, что в выражения в фигурных скобках можно вкладывать выражения с подстано вочными символами имен файлов и каталогов, а также другие выражения в фигурных скобках. Это следствие того, что первыми подставляются вложенные символы. Рассмотрим следующий пример.
$ mkdir newdir/{firstdir,firstdir/'dir<01,02}}
По этой команде создаются следующие кащлоги.
firstdir/dir02
В приведенной команде выражение {01,02} вложено в другое выражение в фигурных скобках.
Точно так же внутри фигурных скобок можно указывать выражения с подстановочными символами имен файлов и каталогов. По команде
$ chmod 644 testfile.{tx?,bak,0[0-9]}
происходит изменение разрешений доступа к серии файлов, в том числе ко всем файлам, соответствующим выражениям testfile. tx?, testfile.bak и от testfile.00 до testfile.09.
Подстановка команд
Еще один вариант применения подстановочных символов - подстановка команд, напоминающая конвейеризацию. При конвейеризации стандартный вывод одной команды переадресуется на стандартный ввод другой, при подстановке же он передается другой команде как аргумент или параметр.
Для примера, рассмотрим ситуацию, в которой необходимо сжать все файлы с расширением . bak. Список этих файлов можно получить, введя команду
$ find / -name '*.bak' -print
Этой же командой с флажком exec можно воспользоваться для сжатия всех файлов.
$ find / -name '*.bak r -exec gzip {} \;
Другой вариант - подстановка команды, как в следующем примере.
$ gzip "find / -name '*.bak' -print"
Здесь команда find заключена в обратные одинарные кавычки, указывающие, что ее результаты должны использоваться как часть командной строки - в данном случае, как аргументы команды gzip.
Существует альтернативная форма этой конструкции - без обратных кавычек:
$ gzip $(find / -name \*.bak -print)
Основное различие между двумя конструкциями - смысл обратной косой (\) в первой из них. Этот смысл сохраняется, если не указаны символы "$","'" или "\".
Примечание
Приведенный перечень подстановочных символов оболочки Bash не полон. Полный список, наряду с подробным описанием, можно найти на странице руководства Bash. Однако и то, что мы описали, рбеспечивает немалые возможности. Если вам понадобятся дополнительные средства- связанные с подстановочными символами, обратитесь к странице руководства, воспользовавшись командой man bash.
Что дальше
Итак, вы освоили работу с оболочкой и можете творить чудеса с Bash. Пора переходить к работе с реальными, практическими программами.
В следующей главе мы приступим к изучению важных задач системного администрирования. Среди них - управление пользователями и группами пользователей, составление расписания запуска заданий и управление способами загрузки Linux.