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.