Операционная система UNIX - страница 37

стр.

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

Текст скрипта test5.sh:

>#!/bin/sh

>echo "input: "

>while read var1 var2 var3

>do

> echo var1=$var1

> echo var2=$var2

> echo var3=$var3

> echo "input: "

>done

Запуск скрипта

>$ test5.sh

>input: пример работы команды read

>var1=пример

>var2=работы

>var3=команды read

>input: еще пример

>var1=еще

>var2=пример

>var3=

>input: ^D

>$

В приведенном примере read в цикле считывает пользовательский ввод. Цикл завершается, когда достигнут конец файла (что эквивалентно пользовательскому вводу <Ctrl>+<D>), поскольку при этом read возвращает неудачу (код возврата равен 1) и while завершает работу. В первом цикле число введенных слов превышает количество переменных, поэтому значение переменной >var3 состоит из двух слов. Во втором цикле значение >var3 пусто.

Система управления заданиями

Командный интерпретатор может поддерживать управление заданиями. Для Bourne shell (/bin/sh), который мы рассматриваем, систему управления заданиями включает парный ему интерпретатор /bin/jsh. В остальном этот интерпретатор имеет те же возможности.

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

Состояние заданияХарактеристики
Выполняется в текущем режимеЗадание может считывать данные и выводить данные на терминал пользователя
Выполняется в фоновом режимеЗаданию запрещен ввод с терминала. Возможность вывода на терминал определяется дополнительными установками
ПриостановленоЗадание не выполняется

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

>%jobid

где >jobid может принимать следующие значения:

>% или >+Текущее задание — самое последнее запущенное или вновь запущенное задание
>-Предыдущее задание (по отношению к текущему)
>?строкаЗадание, для которого >строка присутствует в командной строке запуска
>nЗадание с номером n
>prefЗадание, на которое можно уникально указать префиксом >pref, например, команда ls(1), запущенная в фоновом режиме, адресуется заданием %ls

Система управления заданиями позволяет использовать следующие дополнительные команды:

>bg [%jobid]Продолжает выполнение остановленного задания в фоновом режиме. Без параметра относится к текущему заданию.
>fg [%jobid]Продолжает выполнение остановленного задания в текущем режиме. Если задание >jobid выполнялось в фоновом режиме, команда перемещает его в текущий режим.
>jobs [-p | -l] [%jobid ... ]Выводит информацию об остановленных и фоновых заданиях с указанными номерами. Если последний аргумент опущен, выводится информация обо всех остановленных и фоновых заданиях. Приведенные ниже опции изменяют формат вывода: >-l Вывести идентификатор группы процессов и рабочий каталог. >-р Вывести только идентификатор группы процессов.
>kill [-signo] %jobidОбеспечивает те же возможности, что и команда kill(1), но по отношению к заданиям.
>stop %jobidОстанавливает выполнения фонового задания.
>wait %jobidОжидает завершения выполнения задания >jobid и возвращает его код возврата.

Приведенный ниже пример иллюстрирует использование команд управления заданиями и не нуждается в комментариях:

>$ inf.j &

>[1] 9112

>$ comm1 &

>[2] 9113

>$ jobs

>[1] - Running inf.j

>[2] + Running comm1

>$ stop %1

>$ jobs

>[1] - Stopped (signal) inf.j

>[2] + Running comm1

>$ stop %%

>$ jobs -1

>[1] - 9112 Stopped (signal) inf.j (wd: /home/andy/SH//JOB)

>[2] + 9113 Stopped (signal) comm1 (wd: /home/andy/SH/JOB)

>$ bg %1

>[1] inf.j &

>$ jobs

>[1] + Running inf.j

>[2] - Stopped (signal) comm1

>$ kill %1 %2

>$ jobs

>[1] + Done(208) inf.j

>[2] - Done (208) comm1

>$

Основные утилиты UNIX

В предыдущих разделах мы использовали некоторые утилиты UNIX. Ниже приводятся краткие характеристики утилит, выпавших из поля нашего зрения. Более подробно с различными утилитами можно познакомиться в электронном справочнике