135
8. SHELL - ИНТЕРПРЕТАТОР КОМАНДНОГО ЯЗЫКА
В этом разделе описаны команды и символы, имеющие
специальное значение, которые позволяют:
- находить с помощью шаблона и манипулировать группами
файлов;
- запускать команду в фоновом режиме или в определенное
время;
- выполнять последовательно группу команд;
- перенаправлять стандартный ввод и вывод;
- завершать работающие программы.
8.1. Метасимволы
В табл. 20 приведены метасимволы, используемые shell.
Таблица 20
Метасимволы
----------------------------------------------------------
Символ | Функция
----------------------------------------------------------
* ? [ ] |Эти метасимволы позволяют указывать
|сокращенные имена файлов при поиске по шаблону
& |Означает, что команда будет выполняться в
|фоновом режиме
; |Точка с запятой разделяет команды в командной
|строке
\ |Отменяет специальное значение символов, таких
|как *, ?, [, ],&, ;, <, >, |
'...' |Одиночные кавычки отменяют значение пробела
|как разделителя и специальное значение всех
|символов
"..." |Двойные кавычки отменяют значение пробела
|как разделителя и специальное значение всех
|символов, за исключением $ и \
> |Перенаправляет вывод команды в файл
< |Перенаправляет ввод для команды из файла
>> |Перенаправляет вывод команды, который должен
|быть добавлен в конец существующего файла
| |Создает канал, направляющий вывод одной
|команды во ввод другой команды
`...` |Используется в паре; позволяет использовать
|вывод команды как аргументы в командной строке
$ |Используется с позиционными параметрами и
|определенными пользователем пременными; также
|используется по умолчанию в качестве подсказки
|shell
-----------------------------------------------------------
Метасимволы используются для поиска имен файлов,
посредством их упрощается задача указания файлов или групп
файлов как аргументов команды.
8.1.1. Поиск всех символов (метасимвол *)
Метасимвол * осуществляет поиск любой строки символов,
включая нулевую (пустую) строку. Вы можете использовать *
для обозначения полного или частичного имени файла. Просто
136
символ * ищет все имена файлов и справочников в текущем
справочнике, за исключением тех, которые начинаются с точки.
Чтобы посмотреть метасимвол * в действии, введите его как
аргумент в команде echo:
echo *
В ответ система распечатает перечень всех имен файлов в
вашем текущем справочнике.
Символ * может представлять символы в любой части имени
файла. Например, если вы знаете, что несколько файлов имеют
одинаковые первые и последние буквы, то вы можете выдать
запрос, основываясь на этом факте. Если в вашем справочнике
находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE,
FAST_LINE, то для отображения всех этих файлов на экране
введите команду:
ls F*E
Вы можете, например, с помощью метасимвола * найти все
файлы с именами memo в системном справочнике:
ls */memo
8.1.2. Поиск по одному символу (метасимвол ?)
Метасимвол ? осуществляет поиск любого одного символа в
имени файла за исключением лидирующей точки. Предположим, вы
имеете книгу, в которой 12 глав и хотите получить список
глав до 9-ой главы. Если ваш справочник содержит следующие
файлы:
Chapter1
Chapter2
Chapter5
Chapter9
Chapter11
то введите команду ls с метасимволом ? для получения всех
глав, которые начинаются со строки "Chapter" и заканчиваются
одним символом:
$ ls Chapter?
Chapter1
Chapter2
Chapter5
Chapter9
$
Хотя метасимвол осуществляет поиск одного символа, вы
можете использовать его для поиска более одного символа в
имени файла. Например, вы получите перечень всех остальных
глав в текущем справочнике, если введете следующую команду:
ls Chapter??
И, конечно, чтобы получить список всех глав в текущем
справочнике, используйте метасимвол *:
ls Chapter*
8.1.3. Поиск одного набора (метасимвол [])
Если вы хотите, чтобы shell нашел любой символ из
перечисленных вами символов, то заключите эти символы в
квадратные скобки. Предположим, ваш справочник содержит
следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь
в качестве части имени файла шаблоном [crf], то shell будет
искать имена файлов, в которые входят либо буква "c", либо
буква "r", либо буква "f" в указанной позиции. Пример:
137
$ ls [crf]at
cat
fat
rat
$
Символы, которые могут быть сгруппированы в скобки,
называются классом символов.
Скобки могут также использоваться для обозначения
диапазона символов, цифр или букв. Предположим в вашем
справочнике содержатся следующие файлы: chapter1, chapter2,
chapter3, chapter4, chapter5, chapter6. Если вы укажете:
chapter[1-5]
то shell найдет файлы c chapter1 по chapter5.
Класс символов можно также указать с помощью диапазона
букв. Если вы укажете [A-Z], то shell будет искать только
большие буквы, если [a-z] - то малые буквы.
8.2. Специальные символы
shell имеет также и другие символы, которые выполняют
различные полезные функции.
8.2.1. Запуск команды в фоновом режиме (символ
&)
Некоторые команды shell занимают много времени при
выполнении. Эти команды можно запустить в фоновом режиме с
использованием&, освобождая тем самым терминал для других
задач. Общий формат для запуска команд в фоновом режиме
следующий:
command&
Примечание. Интерактивные команды shell (например,
read) нельзя запускать в фоновом режиме.
Когда вы запускаете команду в фоновом режиме, то
система UNIX выводит номер процесса. Вы можете использовать
этот номер для завершения выполняющейся в фоновом режиме
команды. Появившаяся подсказка означает, что терминал
свободен и ожидает вашу команду.
Запустить команду в фоновом режиме вы можете только в
том случае, если ваш терминал предоставляет вам такую
возможность.
8.2.2. Последовательное выполнение команд
(символ ;)
В одной командной строке вы можете указать несколько
команд. Эти команды должны быть разделены символом ; (точка
с запятой) или символом& (амперсанд):
command1; command2; command3
Система UNIX выполняет команды в том порядке, в котором
они стоят в командной строке, и печатает вывод этих команд в
том же порядке. Этот процесс называется последовательным
выполнением.
Например, введите:
cd; pwd; ls
shell выполнит эти команды последовательно:
1. cd изменит ваше местоположение, переместив вас в
138
регистрационный справочник;
2. pwd распечатает полное имя пути вашего текущего
справочника;
3. ls перечислит файлы в вашем текущем справочнике.
8.2.3. Отмена специального значения (метасимвол
\)
Символ \ позволяет вам отменить специальное значение
следующего за ним символа. Например, у вас есть файл trail,
который содержит следующий текст:
The all * game
was held in Summit.
Чтобы найти символ звездочка (*) в файле, воспользуйтесь
командой grep:
$ grep \* trail
The all * game
$
команда grep найдет символ * в тексте и отобразит строку, в
которой она появилась. Без символа \, символ звездочка будет
интерпретироваться shell как метасимвол.
8.2.4. Отмена специального значения (метасимвол
кавычки)
Отменить специальное значение символа вы также можете с
помощью метасимвола кавычки. Одиночные кавычки ('...')
отменяют специальное значение всех символов за исключением
самих одиночных кавычек. Двойные кавычки ("...") отменяют
специальное значение всех символов, за исключением символов
двойные кавычки, $ и `(слабое ударение). Использование
кавычек удобно для цифровых специальных символов.
Например, ваш файл trail содержит строку:
He really wondered why? Why???
Чтобы найти строку, содержащую три вопросительных знака,
воспользуйтесь командой grep:
$ grep '???' trail
He really wondered why? Why???
$
8.2.4.1. Использование кавычек для отмены
значения символа пробел
Кавычки аналогично обратной косой черте часто
используются для отмены специального значения пробела. shell
интерпретирует пробел в командной строке как разделитель
между аргументами команды. Одиночные и двойные кавычки и
обратная косая черта позволяют отменить это значение.
Например, чтобы в тексте разместить два или более
слова, сделайте эти два слова одним аргументом, заключив их
в кавычки. Чтобы найти два слова "The all" в файле trail,
введите следующую команду:
$ grep 'The all' trail
The all * game
$
Особенно полезно применение отмены специального
значения пробела для функции banner, которая использует
139
пробел как разделитель аргументов и печатает аргументы на
отдельных строках.
Чтобы напечатать более одного аргумента на одной
строке, заключите слова в двойные кавычки. Например, если вы
введете:
banner happy birthday to you
то команда banner напечатает ваше сообщение на 4-х строках.
Если вы введете:
banner happy birthday "to you"
то команда banner напечатает ваше сообщение на 3-х строках,
причем слова "to" и "you" напечатает на одной строке.
Команда banner печатает сообщения на экране терминала
большими плакатного размера буквами.
8.3. Перенаправление ввода и вывода
В системе UNIX некоторые команды ожидают ввод только с
клавиатуры (стандартный ввод) и большинство команд
отображают свой вывод на экране терминала (стандартный
вывод). Однако система UNIX позволяет вам перенаправлять
ввод и вывод в файлы и программы, т.е. вы можете сказать
shell:
- взять ввод из файла, а не с клавиатуры;
- послать вывод в файл, а не на терминал;
- использовать программу как исходные данные для другой
программы.
8.3.1. Перенаправить ввод: знак <
Чтобы перенаправить ввод, укажите в командной строке
после знака "меньше чем" (<) имя файла:
command < имя_файла
8.3.2. Перенаправить вывод: знак >
Чтобы перенаправить вывод, укажите в командной строке
после знака "больше чем" (>) имя файла:
command > имя_файла
Примечание. Если вы перенаправите вывод в уже
существующий файл, то вывод вашей команды заменит содержимое
существующего файла.
Перед тем, как перенаправить вывод команды в конкретный
файл убедитесь, что этот файл не существует. shell не
предупреждает, что выполняет перезапись существующего файла.
Чтобы убедиться, что файл с запланированным именем не
существует, воспользуйтесь командой ls с аргументом
"имя_файла". Если этот файл не существует, то ls выдаст
сообщение, что файл не найден в текущем справочнике.
Например, проверка существования файлов temp и junk даст
следующий результат:
$ ls temp
temp
$ ls junk
junk: no such file or directiry
$
Это означает, что вы можете назвать свой файл junk, но
не можете использовать в качестве имени temp, если не хотите
140
потерять содержимое существующего файла.
8.3.3. Добавить вывод в существующий файл
Чтобы добавить вывод в существующий файл и не разрушить
его, вы можете воспользоваться символом >>:
command >> имя_файла
В результате выполнения команды вывод будет добавлен в
конец существующего файла. Если файл не существует, то он
будет создан. Например, рассмотрим как добавить вывод с
помощью команды cat. Команда cat печатает содержимое файлов,
имена которых являются ее аргументами, в стандартный вывод.
Если нет аргументов, то она печатает стандартный ввод в
стандартный вывод. Сначала выполните команду cat без
перенаправления вывода. Затем содержимое файла trial2
добавляем после последней строки в файл trial1 при
выполнении команды cat над файлом rtial2, перенаправив вывод
в файл trial1:
$ cat trial1
This is the first line of trial1.
Hello.
This is the last line of trial1.
$
$ cat trial2
This is the beginning of trial2.
Hello.
This is the end of trial2.
$ cat trial2 >> trial1
$ cat trial1
This is the first line of trial1.
Hello.
This is the last line of trial1.
This is the beginning of trial2.
Hello.
This is the end of trial2.
$
8.3.3.1. Некоторые применения перенаправления
вывода
Перенаправление вывода очень удобно в том случае, если
вы не хотите, чтобы вывод появлялся на экране немедленно,
или хотите сохранить его. Рассмотрим две команды: spell и
sort.
Команда spell
Команда spell сравнивает каждое слово в файле со своим
словарем и печатает список всех потенциальных
орфографических ошибок на экране. Если в словаре spell нет
какого-либо слова (например, персональное имя), то она также
выдает его как орфографическую ошибку. Если вы подадите на
ввод spell большой файл, то его обработка займет много
времени и список ошибок может быть очень большим. Команда
spell распечатывает весь список ошибок сразу. Поэтому лучше
всего перенаправить вывод spell в файл. Например, spell
осуществляет поиск файла memo и помещает список
орфографических ошибок в файл misspell:
$ spell memo > misspell
141
Команда sort
Команда sort размещает строки указанного файла в
алфавитном или цифровом порядке. Прежде чем перенаправить
вывод команды в файл убедитесь, что имя этого файла не
существует. Команда sort сначала очищает файл, который будет
содержать вывод, затем выполняет сортировку и помещает вывод
в пустой файл.
8.3.3.2. Комбинирование фонового режима и
перенаправления вывода
Когда команда запущена в фоновом режиме, то вывод ее
печатается на экране терминала. И если вы используете
терминал в то же время для выполнения других задач, то вывод
фоновой задачи будет прерывать вашу работу. Однако, если
перенаправить вывод в файл, то вы сможете спокойно работать.
Предположим, что вы хотите найти все появления слова
"test" в файле schedule. Запустите команду grep в фоновом
режиме и перенаправьте вывод в файл testfile:
$ grep test schedule > testfile &
Теперь вы можете использовать терминал для других работ
и просмотреть файл testfile позднее.
8.3.4. Перенаправление вывода команде
Символ | называется каналом. Канал является мощным
средством, которое позволяет вам брать вывод одной команды и
использовать его в качестве ввода для другой команды без
создания временных файлов. Таким образом построенная
последовательность команд называется конвейером. Общий
формат конвейера:
command1 | command2 | command3 ...
Вывод command1 используется как ввод для command2. Вывод
command2 используется как ввод для command3.
Чтобы понять насколько эффективен конвейер, рассмотрим
2 способа, которые дают одинаковый результат:
- использование метода перенаправления ввода/вывода.
Запустим одну команду и перенаправим ее вывод во временный
файл. Затем запустим вторую команду, которая берет
содержимое временного файла как ввод. И в конце удалим
временный файл;
- использование метода конвейера. Например, предположим
вы хотите послать сообщение happy birthday с помощью команды
banner владельцу david. Выполним сначала по первому методу:
1. Введите команду banner и перенаправьте ее вывод во
временный файл:
banner happy birhday > message.tmp
2. Введите команду mail и в качестве ввода
воспользуйтесь файлом message.tmp:
mail david < message.tmp
3. Удалите временный файл:
rm message.tmp
Вторым методом это можно сделать быстрее:
banner happy birthday | mail david
142
8.3.5. Подстановка вывода в качестве аргумента
Вывод большинства команд может использоваться как
аргумент в командной строке. Для этого команду заключите
между знаками "слабое ударение" (`...`) и поместите ее в
командной строке в том месте, где вывод будет трактоваться
как аргумент.
Например, вы можете подставить вывод конвейера команд
date и cut в качестве аргумента в команде banner:
$ banner `date | cut -c12-19`
Обратите внимание на результат: система печатает banner
с текущим временем.
8.4. Выполнение, останов и повторный запуск
процессов
В этом подразделе описывается:
- как запустить команду в определенное время с помощью
команд batch и at;
- как получить информацию о состоянии процесса;
- как завершить активный процесс;
- как вновь запустить остановленный процесс;
- как пренести процесс из оперативного в фоновый режим
и наоборот.
8.4.1. Запуск команд в заданное время
Команды batch и at позволяют вам определять время
запуска команды или последовательности команд. При помощи
команды batch система определяет время запуска команды, вы
это можете определить с помощью команды at. Обе команды
ожидают ввод со стандартного ввода (терминала); список
команд, вводимых с терминала, должен завершаться нажатием
клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).
Команда batch очень полезна, если вы запускаете процесс
или программу, которые занимают много системного времени.
Команда batch представляет системе задание (содержащее
последовательность команд для выполнения). Задание ставится
в очередь и запускается как только у системы появляется
возможность. Это позволяет системе быстро отвечать на
запросы других пользователей. Общий формат команды batch:
batch
первая команда
.
.
.
последняя команда
<^d>
Если запускается только одна команда, то ее можно
ввести в одной командной строке:
batch command_line
В следующем примере batch используется для выполнения
команды grep в согласованное время. Команда grep
осуществляет поиск всех файлов в текущем справочнике и
перенаправляет вывод в файл dol.file.
$ batch
grep dollar * > dol.file
<^d>
143
job 155223141.b at Sun Dec 11:14:54 1989
$
После того как вы зададите задание batch, система
выдаст ответ, в котором даны номер задания, дата и время.
Номер задания не то же самое, что номер процесса, который
система генерирует, когда вы запускаете команду в фоновом
режиме.
Команда at позволяет вам указывать точное время
выполнения команд. Общий фомат команды at:
at time
первая команда
.
.
.
последняя команда
<^d>
Аргумент time состоит из времени дня и даты, если дата
не сегодняшняя.
В следующем примере показано, как использовать команду
at для посылки сообщения happy birthday пользователю с
регистрационным именем emily:
$ at 8:15am Feb 27
banner happy birthday | mail emily
<^d>
$
Обратите внимание, что команда at подобно команде batch
выдает ответ с номером задания, датой и временем.
Если вы не хотите, чтобы команды, находящиеся в данный
момент в очереди заданий batch или at были выполнены, то
можете удалить их из очереди. Для этого воспользуйтесь
опцией -r в команде at, указав ее с номером задания. Общий
формат такой команды:
at -r jobnumber
Например, чтобы удалить предыдущее задание at, введите:
at -r 453400603.a
Если вы забыли номер задания, то команда :
at -l
распечатает вам список текущих заданий в очереди batch или
at, как показано на следующем экране:
$ at -lCW
user mylogin 168302040.a at Sat Nov 25 13:00:00 1989
user mylogin 453400603.a at Fri Feb 24 08:15:00 1989
$
Таким образом команда at выполняет команды в указанное
время. Вы можете использовать от одной до 4-х цифр и
буквосочетания "am" и "pm", чтобы указать время. Чтобы
указать дату, задайте имя месяца и вслед за ним число. Если
задание должно быть выполнено сегодня, то дату вводить не
надо.
Пример.
at 08:15am Feb 27
at 5:14pm Sept 24
8.4.2. Получить состояние запущенного процесса
Команда ps дает вам состояние всех процессов,
запущенных на данный момент. Например, вы можете
использовать команду ps, чтобы просмотреть состояние всех
процессов, которые запущены в фоновом режиме, применив
144
символ&.
В следующем подпункте обсуждается вопрос, как применить
номер PID (идентификатор процесса), чтобы остановить
выполнение команды. PID является уникальным номером, который
система UNIX назначает каждому активному процессу.
В следующем примере команда grep запускается в фоновом
режиме и затем выдается команда ps. Система сообщает в ответ
номер идентификации процесса (PID) и номер терминала (TTY).
Она также выдает время выполнения каждого процесса (TIME) и
имя команды, которая выполняется (COMMAND):
$ grep word * > temp
28223
$
$ ps
PID TTY TIME COMD
28124 tty10 0:00 sh
28223 tty10 0:04 grep
28224 tty10 0:04 ps
$
Обратите внимание, что система распечатала номер PID
для команды grep так же, как и для всех других запущенных
процессов: для самой команды ps и команды sh, которая была
запущена во время вашей регистрации.
Вы можете приостановить и вновь запустить программу,
если в вашей системе предусмотрена функция управления
заданиями. Команда jobs выдает список текущих фоновых
процессов, запущенных или приостановленных. Команда jobs
дополнительно к PID распечатывает идентификатор задания
(JID) и имя задания. Чтобы вновь запустить приостановленное
задание, либо возобновить фоновый процесс в оперативном
режиме, вам необходимо знать JID. JID распечатывается на
экране каждый раз, когда вы вводите команду запуска или
останова процесса. Если вы введете:
jobs
то на экране появится следующая информация:
[JID] - Stopped (signal) <имя задания>
или
[JID] + Running <имя задания>
8.4.3. Завершение активных процессов
Команда kill завершает активные процессы в фоновом
режиме и команда stop приостанавливает временно процессы.
Общий формат этих команд:
kill PID
или
stop JID
Обратите внимание, что вы не можете завершать фоновые
задания нажатием клавиш BREAK или DEL. Следующий пример
показывает, как вы можете завершить команду grep, которая
выполняется в фоновом режиме.
Пример.
$ kill 28223
28223 Terminated
$
После того как система выдаст ответ на запрос, на
экране появится подсказка $, означающая, что процесс
завершен. Если система не найдет указанный PID, то появится
сообщение об ошибке:
145
kill:28223:No such process
Чтобы приостановить оперативный процесс (если активна
функция управления заданиями), введите:
ctrl Z
На экране появится следующее сообщение:
Stopped(user) <имя задания>
8.4.4. Запуск остановленного задания
Если функция управления заданиями активна, то вы можете
вновь запустить приостановленный процесс. Чтобы вновь
запустить процесс, остановленный командой stop, вы сначала
должны определить JID с помощью команды jobs. Затем вы
можете использовать JID со следующими командами:
fg - возобновляет приостановленное задание
или переводит задание из фонового ре-
жима в оперативный;
bg - вновь запускает приостановленное зада-
ние в фоновом режиме.
8.4.5. Использование команды nohup
Все процессы, за исключением at и batch, завершаются,
когда вы выходите из системы. Если вы хотите, чтобы после
вашего выхода из системы процесс в фоновом режиме продолжал
выполняться, то вам необходимо использовать команду nohup.
Команда nohup имеет следующий формат:
nohup command&
Предположим, вы хотите, чтобы команда grep осуществила
поиск во всех файлах в вашем текущем справочнике строки
"word" и перенаправила вывод в файл word.list, и затем, не
ожидая завершения, вы хотите выйти из системы, то введите
следующую строку:
nohup grep word * > word.list&
Вы можете завершить команду nohup с помощью команды
kill.