(Занятие 8) Shell - интерпретатор командного языка
Операционная система UNIX (руководство пользователя)
vsit, Wednesday 02 August 2006 - 10:53:04

[newpage=Shell] 8. Shell - интерпретатор командного языка

В этом разделе описаны команды и символы, имеющие специальное значение, которые позволяют:



8.1. Метасимволы

В табл. 20 приведены метасимволы, используемые shell.

Таблица 20
Метасимволы


Символ Функция
* ? [ ] Эти метасимволы позволяют указывать сокращенные имена файлов при поиске по шаблону
& Означает, что команда будет выполняться в фоновом режиме
; Точка с запятой разделяет команды в командной строке
\ Отменяет специальное значение символов, таких как *, ?, [, ], &, ;, <, >, |
'...' Одиночные кавычки отменяют значение пробела как разделителя и специальное значение всех символов
"..." Двойные кавычки отменяют значение пробела как разделителя и специальное значение всех символов, за исключением $ и \
> Перенаправляет вывод команды в файл
< Перенаправляет ввод для команды из файла
>> Перенаправляет вывод команды, который должен быть добавлен в конец существующего файла
| Создает канал, направляющий вывод одной команды во ввод другой команды
`...` Используется в паре; позволяет использовать вывод команды как аргументы в командной строке
$ Используется с позиционными параметрами и определенными пользователем пременными; также используется по умолчанию в качестве подсказки shell


Метасимволы используются для поиска имен файлов, посредством их упрощается задача указания файлов или групп файлов как аргументов команды.

8.1.1. Поиск всех символов (метасимвол *)

Метасимвол * осуществляет поиск любой строки символов, включая нулевую (пустую) строку. Вы можете использовать * для обозначения полного или частичного имени файла. Просто символ * ищет все имена файлов и справочников в текущем справочнике, за исключением тех, которые начинаются с точки. Чтобы посмотреть метасимвол * в действии, введите его как аргумент в команде echo:


    echo *<CR>


В ответ система распечатает перечень всех имен файлов в вашем текущем справочнике.

Символ * может представлять символы в любой части имени файла. Например, если вы знаете, что несколько файлов имеют одинаковые первые и последние буквы, то вы можете выдать запрос, основываясь на этом факте. Если в вашем справочнике находятся файлы FATE, FE, FADED_LINE, FIG3.4E, FINE_LINE, FAST_LINE, то для отображения всех этих файлов на экране введите команду:


    ls F*E<CR>


Вы можете, например, с помощью метасимвола * найти все файлы с именами memo в системном справочнике: ls */memo

8.1.2. Поиск по одному символу (метасимвол ?)

Метасимвол ? осуществляет поиск любого одного символа в имени файла за исключением лидирующей точки. Предположим, вы имеете книгу, в которой 12 глав и хотите получить список глав до 9-ой главы. Если ваш справочник содержит следующие файлы:


        Chapter1
        Chapter2
        Chapter5
        Chapter9
        Chapter11


то введите команду ls с метасимволом ? для получения всех глав, которые начинаются со строки "Chapter" и заканчиваются одним символом:


        $ ls Chapter?<CR>



        Chapter1
        Chapter2
        Chapter5
        Chapter9
        $


Хотя метасимвол осуществляет поиск одного символа, вы можете использовать его для поиска более одного символа в имени файла. Например, вы получите перечень всех остальных глав в текущем справочнике, если введете следующую команду:


    ls Chapter??<CR>


И, конечно, чтобы получить список всех глав в текущем справочнике, используйте метасимвол *:


    ls Chapter*<CR>


8.1.3. Поиск одного набора (метасимвол [])
Если вы хотите, чтобы shell нашел любой символ из перечисленных вами символов, то заключите эти символы в квадратные скобки. Предположим, ваш справочник содержит следующие файлы: cat, fat, mat, rat. Если вы воспользуетесь в качестве части имени файла шаблоном [crf], то shell будет искать имена файлов, в которые входят либо буква "c", либо буква "r", либо буква "f" в указанной позиции. Пример:


        $ ls [crf]at<CR>



        cat
        fat
        rat
        $


Символы, которые могут быть сгруппированы в скобки, называются классом символов.

Скобки могут также использоваться для обозначения диапазона символов, цифр или букв. Предположим в вашем справочнике содержатся следующие файлы: chapter1, chapter2, chapter3, chapter4, chapter5, chapter6. Если вы укажете:


    chapter[1-5]


то shell найдет файлы c chapter1 по chapter5.

Класс символов можно также указать с помощью диапазона букв. Если вы укажете [A-Z], то shell будет искать только большие буквы, если [a-z] - то малые буквы.

[newpage=Специальные символы]

8.2. Специальные символы

shell имеет также и другие символы, которые выполняют различные полезные функции.

8.2.1. Запуск команды в фоновом режиме (символ &)

Некоторые команды shell занимают много времени при выполнении. Эти команды можно запустить в фоновом режиме с использованием &, освобождая тем самым терминал для других задач. Общий формат для запуска команд в фоновом режиме следующий:


    command &<CR>


Примечание. Интерактивные команды shell (например, read) нельзя запускать в фоновом режиме.

Когда вы запускаете команду в фоновом режиме, то система UNIX выводит номер процесса. Вы можете использовать этот номер для завершения выполняющейся в фоновом режиме команды. Появившаяся подсказка означает, что терминал свободен и ожидает вашу команду.

Запустить команду в фоновом режиме вы можете только в том случае, если ваш терминал предоставляет вам такую возможность.

8.2.2. Последовательное выполнение команд (символ ;)

В одной командной строке вы можете указать несколько команд. Эти команды должны быть разделены символом ; (точка с запятой) или символом & (амперсанд):


    command1; command2; command3<CR>


Система UNIX выполняет команды в том порядке, в котором они стоят в командной строке, и печатает вывод этих команд в том же порядке. Этот процесс называется последовательным выполнением.

Например, введите:


    cd; pwd; ls<CR>


shell выполнит эти команды последовательно:



8.2.3. Отмена специального значения (метасимвол \)

Символ \ позволяет вам отменить специальное значение следующего за ним символа. Например, у вас есть файл trail, который содержит следующий текст:


        The all * game
        was held in Summit.


Чтобы найти символ звездочка (*) в файле, воспользуйтесь командой grep:


        $ grep \* trail<CR>



        The all * game
        $


команда grep найдет символ * в тексте и отобразит строку, в которой она появилась. Без символа \, символ звездочка будет интерпретироваться shell как метасимвол.

8.2.4. Отмена специального значения (метасимвол кавычки)

Отменить специальное значение символа вы также можете с помощью метасимвола кавычки. Одиночные кавычки ('...') отменяют специальное значение всех символов за исключением самих одиночных кавычек. Двойные кавычки ("...") отменяют специальное значение всех символов, за исключением символов двойные кавычки, $ и `(слабое ударение). Использование кавычек удобно для цифровых специальных символов.

Например, ваш файл trail содержит строку:


    He really wondered why? Why???


Чтобы найти строку, содержащую три вопросительных знака, воспользуйтесь командой grep:


    $ grep '???' trail<CR>



    He really wondered why? Why???
    $


8.2.4.1. Использование кавычек для отмены значения символа пробел

Кавычки аналогично обратной косой черте часто используются для отмены специального значения пробела. shell интерпретирует пробел в командной строке как разделитель между аргументами команды. Одиночные и двойные кавычки и обратная косая черта позволяют отменить это значение.

Например, чтобы в тексте разместить два или более слова, сделайте эти два слова одним аргументом, заключив их в кавычки. Чтобы найти два слова "The all" в файле trail, введите следующую команду:


        $ grep 'The all' trail<CR>



        The all * game
        $


Особенно полезно применение отмены специального значения пробела для функции banner, которая использует пробел как разделитель аргументов и печатает аргументы на отдельных строках.

Чтобы напечатать более одного аргумента на одной строке, заключите слова в двойные кавычки. Например, если вы введете:


    banner happy birthday to you<CR>


то команда banner напечатает ваше сообщение на 4-х строках. Если вы введете:


    banner happy birthday "to you"<CR>


то команда banner напечатает ваше сообщение на 3-х строках, причем слова "to" и "you" напечатает на одной строке.

Команда banner печатает сообщения на экране терминала большими плакатного размера буквами.

[newpage=Перенаправление ввода и вывода]

8.3. Перенаправление ввода и вывода

В системе UNIX некоторые команды ожидают ввод только с клавиатуры (стандартный ввод) и большинство команд отображают свой вывод на экране терминала (стандартный вывод). Однако система UNIX позволяет вам перенаправлять ввод и вывод в файлы и программы, т.е. вы можете сказать shell:



8.3.1. Перенаправить ввод: знак <

Чтобы перенаправить ввод, укажите в командной строке после знака "меньше чем" (<) имя файла:


    command < имя_файла<CR>



8.3.2. Перенаправить вывод: знак >

Чтобы перенаправить вывод, укажите в командной строке после знака "больше чем" (>) имя файла:


    command > имя_файла<CR>


Примечание. Если вы перенаправите вывод в уже существующий файл, то вывод вашей команды заменит содержимое существующего файла.

Перед тем, как перенаправить вывод команды в конкретный файл убедитесь, что этот файл не существует. shell не предупреждает, что выполняет перезапись существующего файла.

Чтобы убедиться, что файл с запланированным именем не существует, воспользуйтесь командой ls с аргументом "имя_файла". Если этот файл не существует, то ls выдаст сообщение, что файл не найден в текущем справочнике. Например, проверка существования файлов temp и junk даст следующий результат:


        $ ls temp<CR>



        temp
        $ ls junk<CR>



        junk: no such file or directiry
        $


Это означает, что вы можете назвать свой файл junk, но не можете использовать в качестве имени temp, если не хотите потерять содержимое существующего файла.

8.3.3. Добавить вывод в существующий файл
Чтобы добавить вывод в существующий файл и не разрушить его, вы можете воспользоваться символом >>:


    command >> имя_файла<CR>


В результате выполнения команды вывод будет добавлен в конец существующего файла. Если файл не существует, то он будет создан. Например, рассмотрим как добавить вывод с помощью команды cat. Команда cat печатает содержимое файлов, имена которых являются ее аргументами, в стандартный вывод. Если нет аргументов, то она печатает стандартный ввод в стандартный вывод. Сначала выполните команду cat без перенаправления вывода. Затем содержимое файла trial2 добавляем после последней строки в файл trial1 при выполнении команды cat над файлом rtial2, перенаправив вывод в файл trial1:


        $ cat trial1<CR>



        This is the first line of trial1.
        Hello.
        This is the last line of trial1.
        $
        $ cat trial2<CR>



        This is the beginning of trial2.
        Hello.
        This is the end of trial2.
        $ cat trial2 >> trial1<CR>



        $ cat trial1<CR>



        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<CR>


Команда sort

Команда sort размещает строки указанного файла в алфавитном или цифровом порядке. Прежде чем перенаправить вывод команды в файл убедитесь, что имя этого файла не существует. Команда sort сначала очищает файл, который будет содержать вывод, затем выполняет сортировку и помещает вывод в пустой файл.

8.3.3.2. Комбинирование фонового режима и перенаправления вывода

Когда команда запущена в фоновом режиме, то вывод ее печатается на экране терминала. И если вы используете терминал в то же время для выполнения других задач, то вывод фоновой задачи будет прерывать вашу работу. Однако, если перенаправить вывод в файл, то вы сможете спокойно работать.

Предположим, что вы хотите найти все появления слова "test" в файле schedule. Запустите команду grep в фоновом режиме и перенаправьте вывод в файл testfile:

$ grep test schedule > testfile
Теперь вы можете использовать терминал для других работ и просмотреть файл testfile позднее.

8.3.4. Перенаправление вывода команде

Символ | называется каналом. Канал является мощным средством, которое позволяет вам брать вывод одной команды и использовать его в качестве ввода для другой команды без создания временных файлов. Таким образом построенная последовательность команд называется конвейером. Общий формат конвейера:


        command1 | command2 | command3 ... <CR>


Вывод command1 используется как ввод для command2. Вывод command2 используется как ввод для command3.

Чтобы понять насколько эффективен конвейер, рассмотрим 2 способа, которые дают одинаковый результат:



8.3.5. Подстановка вывода в качестве аргумента

Вывод большинства команд может использоваться как аргумент в командной строке. Для этого команду заключите между знаками "слабое ударение" (`...`) и поместите ее в командной строке в том месте, где вывод будет трактоваться как аргумент.

Например, вы можете подставить вывод конвейера команд date и cut в качестве аргумента в команде banner:


    $ banner `date | cut -c12-19`<CR>


Обратите внимание на результат: система печатает banner с текущим временем.

[newpage=Выполнение, останов и повторный запуск процессов]

8.4. Выполнение, останов и повторный запуск процессов

В этом подразделе описывается:



8.4.1. Запуск команд в заданное время

Команды batch и at позволяют вам определять время запуска команды или последовательности команд. При помощи команды batch система определяет время запуска команды, вы это можете определить с помощью команды at. Обе команды ожидают ввод со стандартного ввода (терминала); список команд, вводимых с терминала, должен завершаться нажатием клавиши ^d (одновременное нажатие клавиши Ctrl и клавиши d).

Команда batch очень полезна, если вы запускаете процесс или программу, которые занимают много системного времени. Команда batch представляет системе задание (содержащее последовательность команд для выполнения). Задание ставится в очередь и запускается как только у системы появляется возможность. Это позволяет системе быстро отвечать на запросы других пользователей. Общий формат команды batch:


        batch<CR>



        первая команда<CR>



        .
        .
        .
        последняя команда<CR>



        <^d>


Если запускается только одна команда, то ее можно ввести в одной командной строке:


    batch command_line<CR>


В следующем примере batch используется для выполнения команды grep в согласованное время. Команда grep осуществляет поиск всех файлов в текущем справочнике и перенаправляет вывод в файл dol.file.


        $ batch<CR>



        grep dollar * > dol.file<CR>



        <^d>        job 155223141.b at Sun Dec 11:14:54 1989
        $


После того как вы зададите задание batch, система выдаст ответ, в котором даны номер задания, дата и время. Номер задания не то же самое, что номер процесса, который система генерирует, когда вы запускаете команду в фоновом режиме.

Команда at позволяет вам указывать точное время выполнения команд. Общий фомат команды at:


        at time<CR>



        первая команда<CR>



        .
        .
        .
        последняя команда<CR>



        <^d>


Аргумент time состоит из времени дня и даты, если дата не сегодняшняя.

В следующем примере показано, как использовать команду at для посылки сообщения happy birthday пользователю с регистрационным именем emily:


        $ at 8:15am Feb 27<CR>



        banner happy birthday | mail emily<CR>



        <^d>        $


Обратите внимание, что команда at подобно команде batch выдает ответ с номером задания, датой и временем.

Если вы не хотите, чтобы команды, находящиеся в данный момент в очереди заданий batch или at были выполнены, то можете удалить их из очереди. Для этого воспользуйтесь опцией -r в команде at, указав ее с номером задания. Общий формат такой команды:


    at -r jobnumber<CR>


Например, чтобы удалить предыдущее задание at, введите:


    at -r 453400603.a<CR>


Если вы забыли номер задания, то команда :


    at -l 


распечатает вам список текущих заданий в очереди batch или at, как показано на следующем экране:


        $ at -l<CR>CW



        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, чтобы просмотреть состояние всех процессов, которые запущены в фоновом режиме, применив символ &.

В следующем подпункте обсуждается вопрос, как применить номер PID (идентификатор процесса), чтобы остановить выполнение команды. PID является уникальным номером, который система UNIX назначает каждому активному процессу.

В следующем примере команда grep запускается в фоновом режиме и затем выдается команда ps. Система сообщает в ответ номер идентификации процесса (PID) и номер терминала (TTY). Она также выдает время выполнения каждого процесса (TIME) и имя команды, которая выполняется (COMMAND):


        $ grep word * > temp <CR>



        28223
        $
        $ ps<CR>



        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<CR>


то на экране появится следующая информация:


    [JID] - Stopped (signal) <имя задания>или 

    [JID] + Running      <имя задания>



8.4.3. Завершение активных процессов

Команда kill завершает активные процессы в фоновом режиме и команда stop приостанавливает временно процессы. Общий формат этих команд:


    kill PID<CR>или 

    stop JID<CR>


Обратите внимание, что вы не можете завершать фоновые задания нажатием клавиш BREAK или DEL. Следующий пример показывает, как вы можете завершить команду grep, которая выполняется в фоновом режиме.

Пример.


        $ kill 28223<CR>



        28223 Terminated
        $


После того как система выдаст ответ на запрос, на экране появится подсказка $, означающая, что процесс завершен. Если система не найдет указанный PID, то появится сообщение об ошибке:


    kill:28223:No such process


Чтобы приостановить оперативный процесс (если активна функция управления заданиями), введите:


    ctrl Z 


На экране появится следующее сообщение:


    <JID> Stopped(user)  <имя задания>



8.4.4. Запуск остановленного задания

Если функция управления заданиями активна, то вы можете вновь запустить приостановленный процесс. Чтобы вновь запустить процесс, остановленный командой stop, вы сначала должны определить JID с помощью команды jobs. Затем вы можете использовать JID со следующими командами:


fg <JID> -

возобновляет приостановленное задание или переводит задание из фонового режима в оперативный;

bg <JID> -

вновь запускает приостановленное задание в фоновом режиме.

8.4.5. Использование команды nohup

Все процессы, за исключением at и batch, завершаются, когда вы выходите из системы. Если вы хотите, чтобы после вашего выхода из системы процесс в фоновом режиме продолжал выполняться, то вам необходимо использовать команду nohup. Команда nohup имеет следующий формат:


    nohup command &<CR>


Предположим, вы хотите, чтобы команда grep осуществила поиск во всех файлах в вашем текущем справочнике строки "word" и перенаправила вывод в файл word.list, и затем, не ожидая завершения, вы хотите выйти из системы, то введите следующую строку:


    nohup grep word * > word.list & <CR>


Вы можете завершить команду nohup с помощью команды kill.




эта статья с Компьютерные сети и технологии
( http://www.xnets.ru/plugins/content/content.php?content.140 )