Операционная система 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. Ниже приводятся краткие характеристики утилит, выпавших из поля нашего зрения. Более подробно с различными утилитами можно познакомиться в электронном справочнике