Ключевые слова:shell, pipe, (найти похожие документы)
From: SpectatoR <SpectatoR@mo3gov.net>
Date: Mon, 28 Feb 2004 14:31:37 +0000 (UTC)
Subject: Использование оболочек в Linux
Оригинал: http://sw32bit.narod.ru/doc/shells.html
Содержание:
1. Оболочки Linux
2. Командная строка оболочки
3. Выполнение программ в фоновом режиме
4. Использование каналов
5. Построение сценариев оболочки
1. Оболочки Linux
Оболочка - это интерпретатор команд, который может использоваться для
запуска, приостановки, остановки и даже написания программ. Оболочка -
неотъемлемая часть системы Linux, а также часть проекта Linux и Unix.
Если представить себе ядро Linux как центральную часть сферы, то
оболочка предстанет в виде внешнего слоя, окружающего ядро. Когда вы
передаете команду из оболочки или других программ в Linux, ядро
соответствующим образом реагирует. Дальше в руководстве приводится
перечень оболочек, доступных в Linux, а также некоторые их
отличительные особенности. С какой оболочкой вы работаете, можно
определить при регистрации в Linux, либо просмотрев содержимое файла
/etc/passwd, либо посредством поиска в этом файле вашего имени
пользователя. Как это выглядит, демонстрирует следующий пример:
# fgrep bball /etc/passwd
bball:x:100:100:William H. Ball,,,,:/home/bball:/bin/bash
Имя оболочки, которой вы пользуетесь, выводится в конце содержимого
вашего файла passwd. Итак начнем.
Особенности оболочки ash
Оболочка ash, автором которой является Кеннет Альмквист, представляет
собой одну из самых маленьких оболочек, доступных в Linux. Эта
оболочка имеет 24 встроенные команды и 10 различных опций командной
строки. Оболочка ash поддерживает большинство из наиболее
распространенных команд оболочки, таких как cd, наряду с большинством
обычных операторов командной строки. Это популярная оболочка, которая
используется при загрузке Linux в однопользовательском режиме, в
защищенном режиме или при загрузке дискетных версий Linux. Объем
исполняемого файла, как правили в раз в 10 меньше, чем у оболочки
bash, делает ash практически незаменимой оболочкой для небольших
файловых систем.
Особенности оболочки Linux по умолчанию - bash
Оболочка bash, или Bourn Again Shell, авторами которой являются Брайан
Фокс и Чет Рамей, представляет собой одну из наиболее популярных
оболочек для Linux. Эта оболочка обладает 48 встроенными командами и
десятком опций командной строки. Оболочка bash работает аналогично
оболочке sh и содержит в каталоге /bin символическую связь с именем
sh, которая указывает на оболочку bash. Помимо того, что bash работает
аналогично оболочке sh, она также обладает возможностями csh и ksh.
Оболочка обладает широкими функциональными возможностями. Вы можете, к
примеру, прокручивать список ранее введенных команд с помощью клавиш
управления курсором, редактировать командную строку и, если вы забыли
точное имя программы, вы можете даже обратится за помощью к оболочке,
использовав сокращенное имя файла. Для этого нужно ввести часть имени
команды, а затем нажать клавишу <Tab>
Клавиша TAB служит для дополнения строки. Например вам нужно ввести
длинное и невероятно сложное имя файла. Просто наберите начало
названия этого файла и нажмите TAB - оно автоматически дополнится. То
же относится ко всем командам.
Общедоступная оболочка Корна - pdksh
Оболочка pdksh первоначально созданная Эриком Гизином, обладает 42
встроенными командами и 20 опциями командной строки. Эта оболочка,
установленная в вашей системе Linux, называется ksh и аналогично
оболочке bash она считывает сценарий инициализации оболочки
/etc/profile, если в вашем домашнем каталоге отсутствует файл
.profile. К сожалению, эта оболочка не поддерживает такую же командную
строку, как оболочка bash. Однако эта оболочка поддерживает управление
заданием, так что вы можете приостановить, перевести в фоновый режим,
повторно вызвать или завершить выполнение программ из командной
строки. Оболочка ksh практически совместима с коммерческими версиями
оболочки Корна, включаемыми в коммерческие дистрибутивы UNIX.
Руководство по этой оболочке можно найти на странице руководства для
ksh и в подкаталоге pdksh каталога /usr/doc/pdksh.
Особенности csh-совместимой оболочки - tcsh
Оболочка zsh, первоначально созданная Паулем Фальстадом (Paul
Falstad), одна из самых больших оболочек для Linux, которая обладает
84 встроенными командами. Оболочка zsh имеет более 50 различных опций
командной строки, а также эмулирует команды оболочек sh и ksh.
Подобно оболочкам bash и tcsh, оболочка zsh позволяет просматривать
ранее введенные команды, а также осуществлять сокращенный ввод,
редактировать и проверять орфографию командной строки. Она также
позволяет использовать функции работы с процессами для управления
программ. Эта оболочка поддерживает широкий набор опций командной
строки для поиска файлов и поиска в файлах по шаблонам подстановки.
Файлы запуска системного уровня для этой оболочки расположены в
каталоге /etc:
/etc/zlogin
/etc/zlogout
/etc/zshenv
/etc/zshrc
Обращение к этим файлам осуществляется в том случае, если оболочка zsh
не обнаружила в вашем домашнем каталоге аналогичных файлов, а только
файлы с лидирующей точкой в имени, например, такой как .zlogin. Эта
оболочка обладает также большим числом опций приглашения командной
строки по сравнению с другими оболочками, такими как bash и tcsh. Эта
оболочка обладает функциональными возможностями, аналогичными всем
другим оболочкам, и способна эмулировать работу оболочек sh и ksh при
вызове в качестве символической связи.
Этой оболочке посвящен большой объем информации: 10 файлов
руководства, а также каталог /usr/doc/zsh, наполненный справками,
примерами и другой актуальной и полезной информацией.
2. Командная строка оболочки
При использовании оболочки для запуска программ из командной строки
оболочка интерпретирует вашу команду, и команда выводит выходные
данные обратно на экран. Пользуясь оболочкой, вы можете отправить
выходные данные программы в нужное место, например в файл. Оболочка
может также использовать вывод одной из программ в качестве ввода
другой программы или даже указать программе на необходимость считывать
входные данные из файла. Вот так можно перенаправить вывод команды ls
в файл:
# touch /tmp/trash/file1 /tmp/trash/file2 /tmp/trash/file3 tmp/trash/file4
#ls -w 1 /tmp/trash/* >trashfiles.txt
Первая командная строка создает четыре файла в каталоге /tmp/trash.
Вторая, используя вывод команды ls, создает текстовый файл, содержащий
имена файлов, расположенных в каталоге /tmp/trash. Символ > -
называется оператором перенаправления стандартного вывода и
используется для перенаправления вывода команды в файл отличный от
предусмотренного по умолчанию. Символ < - оператор перенаправления
стандартного ввода, чтобы подать информацию на вход другой программы.
В качестве простейшего примера вы можете использовать созданный в
предыдущем случае файл trashfiles.txt, содержащий имена файлов из
каталога /tmp/trash, для построения архива с помощью команды cpio. Это
можно сделать, воспользовавшись стандартным вводом для подачи имен
файлов на вход команды trash.cpio:
# cpio -o <trashfiles.txt >trash.cpio
1 block
результате интерпретации командной строки команда cpio считывает
список файлов стандартного ввода, файла trashfiles.txt, а затем
создает архив, направляя свои выходные данные через стандартный вывод
в файл с именем trash.cpio
Теперь, если воспользоваться предыдущим примером и подать на вход
команды cpio список файлов, содержащий ошибку, команда cpio обнаружит
эту ошибку и хотя при этом по-прежнему строит архив, отправляет на ваш
экран сообщение:
# rm -fr /tmp/trash/file3
# cpio -o < trashfiles.txt >trash.cpio
cpio: /tmp/trash/file3: No such file or directory
1 block
Как уже упоминалось, один из существующих файлов был удален, а входной
файл trashfiles.txt, который по-прежнему содержит список файлов, не
был изменен.
Оболочка присваивает каждому файлу ввода и вывода номер. Стандартному
вводу присваивается номер ноль (0), выводу номер один (1), а
стандартному выводу ошибок присваивается номер (2). Зная это, вы
можете спокойно запустить cpio и "заставить" при этом сообщение об
ошибке отправиться в указанный вами файл, а не на экран. Для этого
следует использовать комбинацию оператора перенаправления стандартного
вывода и номера стандартного файла ошибок, как показано в следующем
примере:
# cpio -o < trashfiles.txt >trash.cpio 2>cpio.errors
# cat cpio.errors.errors
cpio: /tmp/trash/file3^ No such file or directory
1 block
Как видно из примера, команда cpio отправила сообщение об обнаруженной
ошибке, которое обычно направляется в стандартный ввод (на экран) в
файл с именем cpio.errors.
Всякий раз, когда вы перенаправляете вывод в файл, либо создается файл
с указанным именем, либо, если файл уже существует, названный файл
перезаписывается и его предыдущее содержимое безвозвратно теряется.
Если вам необходимо сохранить исходное содержимое файла, вы можете
добавить выходные данные программы в конец файла с помощью оператора
перенаправления вывода с конкатенацией (>>) или присоединением
(append):
# cpio -o < trashfiles.txt >trash.cpio 2>>cpio.errors
Эта командная строка сохраняет предыдущее содержимое файла cpio.errors
и дописывает все новые сообщения об ошибках в конец файла. Такой
подход позволяет организовать своего рода журнал регистрации ошибок
при выполнении команды cpio. Этот же метод применяется в случае
включения функции системного журнала Linux. В качестве roota вы можете
просмотреть содержимое файла под названием messages, который
расположен в каталоге /var/log.
Теперь попробуем использовать оператор here для построения простого
примера управления замкнутого файла базы данных посредством
комбинирования команды egrep и перенаправления ввода. Сначала
воспользуйтесь излюбленным редактором (например pico, вместе с pine)
для создания файла с именем db. После этого необходимо будет ввести
список адресов, а затем "упаковать" список, поместив в начало файла
команду egrep, а в конец - строку символов, обозначающих конец ввода.
Итак, создайте файл следующим образом:
# pico db
Теперь введите команду egrep, а после нее - короткий список адресов и
закончите файл строкой символов, соответствующих оператору here,
следующим образом:
egrep -i $1 <<zzzz
Debby,275 Collins Rd., Vestal NY 13850
Cathy, 1001 N. Vermont St., Arlington, VA 22003
Fred, Slip 417, N. Woodward Ave., Boca Raton, FL 46002
zzzz
Сохраните файл, нажав комбинацию клавиш <Ctrl-X>. Наконец, превратите
текстовый файл в исполняемую программу с помощью команды chmod
следующим образом:
# chmod +x db
В результате этих действий создается небольшая база данных адресов.
Протестируйте вашу базу данных, введя в командную строку имя программы
db и какое-либо имя, город, штат или индекс, например так:
# db deb
База данных работает за счет использования команды egrep для
считывания файла до тех пор, пока не встретится строка конца ввода
zzzz. Опция командной строки -i указывает команде egrep на отсутствие
различий между символами верхнего и нижнего регистров. Строка $1 - это
переменная среды оболочки представляет аргумент командной строки,
который подается на вход команды egrep.
3. Выполнение программ в фоновом режиме
Большинство оболочек представляют возможность запуска и последующего
выполнения программ как фоновых процессов. Запуск команды в качестве
фоновой означает, что команда выполняется в оперативной памяти, в то
время как управление командной строкой оболочки возвращается вашей
консоли. Это удобный способ работы в Linux, в особенности, если вы
работаете на отдельном терминале, вам не достает места на экране при
работе в Х11 или ваша система обладает избытком оперативной памяти.
Такие задачи, как сортировка больших файлов или поиск в каталогах и
других файловых системах, неплохие кандидаты на выполнение в фоновом
режиме.
Несмотря на то, что Linux представляет возможность работы с
виртуальными консолями, а многочисленные диспетчеры окон Х11 дают
возможность работать с разными рабочими столами, в процессе работы с
Linux вы, скорее всего, неоднократно будете выполнять программы в
фоновом режиме.
Для запуска программ в фоновом режиме в конец командной строки
добавляется символ амперсанда (&). Например, для запуска еще одной
программы с терминала Х11 вам может потребоваться запустить эту
программу в фоновом режиме, чтобы ваш текущий терминал оставался
свободным для вывода:
# rxvt &
Эта команда запускает терминал rxvt, и приглашение вашей командной
строки вновь становится свободным для ввода. С программой, выполняемой
в фоновом режиме, связывается номер процесса, доступ к которому можно
получить с помощью команды ps (process status - состояние процесса),
как в следующем примере:
# ps
...
291 1 R 0:03 rxvt
...
В приведенном примере ради экономии места перечислены не все
выполняющиеся процессы. Вы можете остановить процесс с помощью команды
оболочки kill, указав номер процесса для программы:
# kill 291
[1]+ Terminated rxvt
Если вы работаете с оболочкой bash, то для перевода выполняющейся
программы в фоновый режим и приостановки ее функционирования следует,
удерживая нажатой клавишу <Ctrl>, нажать клавишу <Z> на клавиатуре:
# pine
... programm is running... (ctrl-z)...
Pine suspended. Give the "fg" command to come back.
[1]+ Stopped (signal) pine
# fg
.... programm returns
С помощью оболочки bash вы можете запускать, приостанавливать и
выполнять несколько программ, а затем выборочно возвращать фоновую
программу на ваш экран, указав номер задания программы:
# pine
... programm is running... (ctrl-z)...
Pine suspended. Give the "fg" command to come back.
[1]+ Stopped (signal) pine
# sc
... programm is running... (ctrl-z)...
[2]+ Stopped sc
# fg %1
.... pine programm returns....
В приведенном примере программа чтения электронной почты pine
запускается, а затем приостанавливается в фоновом режиме для запуска
процессора электронных таблиц sc. Поскольку pine - это первое
приостановленное задание, оболочка присваивает заданию почтовый номер
1. Затем приостанавливается процессор электронных таблиц sc, заданию
которого присваивается номер 2, а выполнение почтовой программы
возобновляется с помощью указания ее номера задания в качестве опции
команды fg %1.
Если вы запускаете и приостанавливаете много заданий в фоновом режиме,
то можете не запомнить, какой номер задания соответствует каждой
программе или какие программы приостановлены. Список приостановленных
программ вы можете получить с помощью команды jobs оболочки bash:
# jobs
[1] Stopped (signal) pine
[2]- Stopped sc
[3]- Stopped emacs-nox
# fg %sc
.... sc programm is running...
Приведенный список показывает, что в текущий момент оболочкой
приостановлены три задания: почтовая программа pine, процессор
электронных таблиц sc и редактор emacs. Обратите внимание, что вместо
того, чтобы возобновить работу процессора электронных таблиц sc с
помощью указания номера его задания, программа вновь переводится в
фоновый режим выполнения с помощью команды fg %, в которой указано имя
приостановленного задания.
На основе точно такого же подхода вы можете также остановить
выполнение программы. Вместо того чтобы использовать команду ps для
установления номера процесса для программы, а затем применить команду
kill, вы можете воспользоваться командой kill с оператором %:
# kill %1
[1]- Stopped (signal) pine
# kill %emacs-nox
[3]+ Stopped emacs-nox
Приведенный пример демонстрирует применение команды kill для остановки
программы по ее номеру или имени. Это значительно легче, чем
использование команды ps, в особенности, если в фоновом режиме
выполняется значительное количество программ или других процессов.
Использование функций управления заданиями вашей оболочки - это мощное
средство эффективной работы с многими программами, в особенности, если
вы пользуетесь одним дисплеем или консолью.
4. Использование каналов
Вы уже знаете, как перенаправить вывод программы в файл и как
перенаправить содержимое файла в другую программу. Но все это можно
сделать одновременно, не используя временный файл, с помощью символа
вертикальной черты (|), который называется каналом (pipe).
Использование каналов для выстраивания последовательности команд в
командной строке называется конвейерной обработкой. Это быстрый и
мощный способ усиления отдельно взятых команд, который представляет
собой особенность Linux и других версий UNIX.
Каналы не только экономят ваше время, вы можете использовать различные
комбинации конвейерных команд для решения вычислительных задач с
учетом особенностей вашего способа работы и используемых программ.
Поначалу ваши конвейерные команды могут быть очень простыми, но по
мере приобретения опыта вы можете конструировать конвейеры
чрезвычайной сложности.
Концепция каналов органично вписывается в Linux, поскольку многие
команды представляют собой еще и фильтры (filters), которые
воспринимают на входе некоторый тип входных данных, обрабатывают или
преобразуют их определенным образом и выдают результат в виде выходных
данных, направленных на стандартный вывод или другую команду. Каналы
могут использоваться практически для любых вычислительных задач, в том
числе для быстрого поиска информации, генерации отчетов,
преобразования данных или просмотра результатов. Рассмотрим сначала
четыре простых примера.
# ls | lpr
# printenv | fgrep EDITOR
# nroff -man mymanpage.1 | less
# cat document.txt | wc | mail -s "document.txt Report" bball
Первая командная строка "пропускает" по каналу содержимое текущего
каталога (ls) через команду запуска на печать (lpr) для печати отчета.
Во втором примере перечень переменных текущей среды оболочки, после
чего на печать выводится "отфильтрованное" значение, соответствующее
используемому по умолчанию текстовому редактору. В третьем примере на
экран в отформатированном виде выводится страница руководства, так что
вы можете просмотреть документ на наличие ошибок. В последнем примере
текстовый документ сперва "перекачивается" через команду подсчета слов
wc, а затем результат подается на вход программы электронной почты,
которая отправляет количество символов, слов и строк, содержащихся в
документе, пользователю по имени bball.
Каналы можно использовать для постановки и решения повседневных задач,
которые обычно не удается решить за счет применения отдельных
программ. Каналы - это действительно "секретное" и мощное оружие
Linux. Например, если в вашей системе имеется большой массив
документов, а вы не помните, какой из документов содержит определенную
фразу, вы можете быстро найти эту информацию. Вместо того, чтобы
запускать текстовый процессор и открывать каждый файл в поисках нужной
фразы, вы можете ввести в командную строку следующий "командный
конвейер":
# find /home -name *.doc | xargs fgrep administration | less
В этой командной строке команда find используется для поиска в
каталоге /home всех файлов, имеющих расширение .doc, после этого она
подает имя каждого такого файла на вход команды xargs. Команда xargs в
свою очередь запускает команду fgrep для поиска в каждом из файлов
слова "administration", после чего результат "пропускается" через
пейджер less. Вы также можете использовать каналы не только для поиска
информации, но и для обработки данных и создания новых файлов.
# find *.doc | xags cat | tr ` ` `\n` | sort | unig | tee dict | less
Приведенный пример строит файл под названием dict, содержащий
отсортированный список уникальных слов, содержащихся во всех текстовых
файлах. Это словарь, но если честно, в таком словаре не все слова
будут написаны правильно.
Эта конвейерная команда работает, "прокачивая" каждый обнаруженный
файл через команду tr, которая преобразует каждый символ пробела в
символ "возврат каретки, перевод строки", чтобы разбить входной поток
на последовательность строк, содержащих по одному слову. Поток строк
сортируется (sort), а команда uniq удаляет все строки, встречающиеся
более одного раза. Обратите внимание, что команда tee используется
также для сохранения выходных данных в виде файла.
Команда tee используется для полного и детализированного сохранения
результатов. Это особенно полезно, когда вам требуется проверить
результаты при конструировании каналов или сохранить промежуточные
результаты в сложном командном конвейере. Рассмотрим следующий пример:
# xwd -out wd.xwd
# xwdtopnm < wd.xwd ppmtopng tee wd.png | pngtopnm | tee wd.pnm |
pnmtotiff >wd.tif
В приведенном примере с помощью команды Х11 xwd осуществляется захват
и сохранение содержимого окна или рабочего стола Х в виде "скриншота"
или дампа. Затем для преобразования этого графического образа в
переносимый растровый формат используется команда xwdtopnm. Выход
команды xwdtopnm затем подается на вход команды ppmtopng. Команда tee
используется в данном случае для сохранения выхода команды ppmtopng -
в формате png - в файле wd.png. Одновременно с этим графический образ
в формате png снова преобразуется переносимый растровый формат с
помощью команды pngtopnm, а команда tee вновь используется для
сохранения растрового изображения - теперь в файле wd.pnm. Наконец
команда pnmtotiff сохраняет переносимый файл растра как графическое
изображение в формате TIFF. В одной командной строке четырехкратное
преобразование графики!
Использование каналов в Linux - простой способ добиться нужного
результата. По мере работы с Linux вы создадите собственный набор
необходимых вам командных строк. Создав такой набор, вы сможете
приступить к конструированию собственных команд оболочки.
5. Построение сценариев оболочки
Чтобы работать в Linux с командами, вовсе не обязательно быть
программистом. После знакомства с различными программами, когда вы
освоите работу с командной строкой и обнаружите, что постоянно вводите
в командную строку одни и те же выражения, сохраните эти командные
строки в виде текстовых файлов и превратите их в сценарии (scripts)
оболочки. В своей простейшей форме сценарий оболочки представляет
собой одну или несколько наиболее часто используемых командных строк.
Рассмотрим следующий пример:
# rxvt -geometry 80*11+803+375 -bg write -fg black -e pico &
# rxvt -geometry 80*24+806+2 -bg write -fg black -e pine &
Эти две командные строки запускают редактор pico и почтовую программу
pine в двух окнах терминала rxvt на втором рабочем столе экрана с
разрешением 800*600. Можно с уверенностью сказать, что ввод подобных
команд всякий раз, когда у вас возникает необходимость запустить эти
программы - удовольствие небольшое. Хотя вам ничто не мешает после
перехода к другому рабочему столу вручную запустить окна терминала,
все же на установку правильных размеров окон и запуск программ
потребуется определенное время. Вы можете, однако, преобразовать эти
команды в исполняемые файлы, сначала сохранив их в виде файлов с
помощью редактора, а затем применив к ним команду chmod:
# chmod +x d2
Теперь, когда у вас возникнет необходимость запустить эти программы,
все что вам нужно сделать - ввести в командную строку выражение, проще
которого вряд ли можно придумать:
# d2
Вы можете обеспечить этой новой команде большую гибкость за счет
использования переменных оболочки $1 и $2, которые представляют первый
и второй аргументы командной строки в команде оболочки. Отредактируйте
созданный вами файл и замените имена программ этими переменными:
# rxvt -geometry 80*11+803+375 -bg write -fg black -e $2 &
# rxvt -geometry 80*24+806+2 -bg write -fg black -e $1 &
Обратите внимание, что порядок переменных не имеет значения. Теперь
при запуске команды вы можете подставить в командную строку имена
программ, как в следующем примере:
# db2 pine pico
Результат этой команды точно такой, как и предыдущей, с той разницей,
что теперь вы имеете возможность запускать в терминальных окнах
практически любые программы.
С помощью оболочки можно быстро построить простые программы для
решения насущных задач.