Чтение онлайн

на главную

Жанры

Искусство программирования на языке сценариев командной оболочки

Купер Мендель

Шрифт:

# === КОНЕЦ БЛОКА ИЗМЕНЕНИЙ, ВНЕСЕННЫХ ПЕРЕВОДЧИКОМ ===

echo "Сценарий отработал $SECONDS $units."

# В случае перегруженности системы, скрипт может перескакивать через отдельные

#+ значения счетчика

sleep $INTERVAL

done

echo -e "\a" # Сигнал!

exit 0

$SHELLOPTS

список

допустимых опций интерпретатора shell. Переменная доступна только для чтения.

bash$ echo $SHELLOPTS

braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs

$SHLVL

Уровень вложенности shell. Если в командной строке

echo $SHLVL

дает 1, то в сценарии значение этой переменной будет больше на 1, т.е. 2.

$TMOUT

Если переменная окружения $TMOUT содержит ненулевое значение, то интерпретатор будет ожидать ввод не более чем заданное число секунд, что, в первичном приглашении (см. описание PS1 выше), может привести к автоматическому завершению сеанса работы.

К сожалению это возможно только во время ожидания ввода с консоли или в окне терминала. А как было бы здорово, если бы можно было использовать эту внутреннюю переменную, скажем в комбинации с командой read! Но в данном контексте эта переменная абсолютно не применима и потому фактически бесполезна в сценариях. (Есть сведения о том, что в ksh время ожидания ввода командой read можно ограничить.)

Организация ограничения времени ожидания ввода от пользователя в сценариях возможна, но это требут довольно сложных махинаций. Как один из вариантов, можно предложить организовать прерывание цикла ожидания по сигналу. Но это потребует написание функции обработки сигналов командой trap (см. Пример 29-5).

Пример 9-2. Ограничения времени ожидания ввода

#!/bin/bash

# timed-input.sh

# TMOUT=3 бесполезно в сценариях

TIMELIMIT=3 # Три секунды в данном случае, но может быть установлено и другое значение

PrintAnswer

{

if [ "$answer" = TIMEOUT ]

then

echo $answer

else # Чтобы не спутать разные варианты вывода.

echo "Ваше любимое растение $answer"

kill $! # "Прибить" ненужную больше функцию TimerOn, запущенную в фоновом процессе.

# $!
– - PID

последнего процесса, запущенного в фоне.

fi

}

TimerOn

{

sleep $TIMELIMIT && kill -s 14 $$ &

# Ждать 3 секунды, после чего выдать sigalarm сценарию.

}

Int14Vector

{

answer="TIMEOUT"

PrintAnswer

exit 14

}

trap Int14Vector 14 # переназначить процедуру обработки прерывания от таймера (14)

echo "Ваше любимое растение? "

TimerOn

read answer

PrintAnswer

# По общему признанию, это не очень хороший способ ограничения времени ожидания,

#+ однако опция "-t"команды "read" упрощает задачу.

# См. "t-out.sh", ниже.

# Если вам нужно что-то более элегантное...

#+ подумайте о написании программы на C или C++,

#+ с использованием соответствующих библиотечных функций, таких как 'alarm' и 'setitimer'.

exit 0

В качестве альтернативы можно использовать stty.

Пример 9-3. Еще один пример ограничения времени ожидания ввода от пользователя

#!/bin/bash

# timeout.sh

# Автор: Stephane Chazelas,

# дополнен автором документа.

INTERVAL=5 # предел времени ожидания

timedout_read {

timeout=$1

varname=$2

old_tty_settings=`stty -g`

stty -icanon min 0 time ${timeout}0

eval read $varname # или просто read $varname

stty "$old_tty_settings"

# См. man stty.

}

echo; echo -n "Как Вас зовут? Отвечайте быстрее! "

Поделиться:
Популярные книги

На границе тучи ходят хмуро...

Кулаков Алексей Иванович
1. Александр Агренев
Фантастика:
альтернативная история
9.28
рейтинг книги
На границе тучи ходят хмуро...

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Последний попаданец 11. Финал. Часть 1

Зубов Константин
11. Последний попаданец
Фантастика:
фэнтези
юмористическое фэнтези
рпг
5.00
рейтинг книги
Последний попаданец 11. Финал. Часть 1

Книга пяти колец

Зайцев Константин
1. Книга пяти колец
Фантастика:
фэнтези
6.00
рейтинг книги
Книга пяти колец

Поступь Империи

Ланцов Михаил Алексеевич
7. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Поступь Империи

Купидон с топором

Юнина Наталья
Любовные романы:
современные любовные романы
7.67
рейтинг книги
Купидон с топором

Наследник в Зеркальной Маске

Тарс Элиан
8. Десять Принцев Российской Империи
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник в Зеркальной Маске

Совок 5

Агарев Вадим
5. Совок
Фантастика:
детективная фантастика
попаданцы
альтернативная история
6.20
рейтинг книги
Совок 5

Аномальный наследник. Том 1 и Том 2

Тарс Элиан
1. Аномальный наследник
Фантастика:
боевая фантастика
альтернативная история
8.50
рейтинг книги
Аномальный наследник. Том 1 и Том 2

Теневой путь. Шаг в тень

Мазуров Дмитрий
1. Теневой путь
Фантастика:
фэнтези
6.71
рейтинг книги
Теневой путь. Шаг в тень

Попаданка в академии драконов 2

Свадьбина Любовь
2. Попаданка в академии драконов
Любовные романы:
любовно-фантастические романы
6.95
рейтинг книги
Попаданка в академии драконов 2

Гром над Империей. Часть 2

Машуков Тимур
6. Гром над миром
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Гром над Империей. Часть 2

Ритуал для призыва профессора

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.00
рейтинг книги
Ритуал для призыва профессора

Измена. Осколки чувств

Верди Алиса
2. Измены
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Измена. Осколки чувств