# === НАЧАЛО БЛОКА ИЗМЕНЕНИЙ, ВНЕСЕННЫХ ПЕРЕВОДЧИКОМ ===
let "last_two_sym = $SECONDS - $SECONDS / 100 * 100" # десятки и единицы
if [ "$last_two_sym" -ge 11 -a "$last_two_sym" -le 19 ]
units="секунд" # для чисел, которые заканчиваются на "...надцать"
let "last_sym = $last_two_sym - $last_two_sym / 10 * 10" # единицы
units="секунду" # для чисел, заканчивающихся на 1
units="секунды" # для чисел, заканчивающихся на 2, 3 и 4
units="секунд" # для всех остальных (0, 5, 6, 7, 8, 9)
# === КОНЕЦ БЛОКА ИЗМЕНЕНИЙ, ВНЕСЕННЫХ ПЕРЕВОДЧИКОМ ===
echo "Сценарий отработал $SECONDS $units."
# В случае перегруженности системы, скрипт может перескакивать через отдельные
список допустимых опций интерпретатора shell. Переменная доступна только для чтения.
braceexpand:hashall:histexpand:monitor:history:interactive-comments:emacs
Уровень вложенности shell. Если в командной строке
дает 1, то в сценарии значение этой переменной будет больше на 1, т.е. 2.
Если переменная окружения $TMOUT содержит ненулевое значение, то интерпретатор будет ожидать ввод не более чем заданное число секунд, что, в первичном приглашении (см. описание PS1 выше), может привести к автоматическому завершению сеанса работы.
К сожалению это возможно только во время ожидания ввода с консоли или в окне терминала. А как было бы здорово, если бы можно было использовать эту внутреннюю переменную, скажем в комбинации с командой read! Но в данном контексте эта переменная абсолютно не применима и потому фактически бесполезна в сценариях. (Есть сведения о том, что в ksh время ожидания ввода командой read можно ограничить.)
Организация ограничения времени ожидания ввода от пользователя в сценариях возможна, но это требут довольно сложных махинаций. Как один из вариантов, можно предложить организовать прерывание цикла ожидания по сигналу. Но это потребует написание функции обработки сигналов командой trap (см. Пример 29-5).
Пример 9-2. Ограничения времени ожидания ввода
# TMOUT=3 бесполезно в сценариях
TIMELIMIT=3 # Три секунды в данном случае, но может быть установлено и другое значение
if [ "$answer" = TIMEOUT ]
else # Чтобы не спутать разные варианты вывода.
echo "Ваше любимое растение $answer"
kill $! # "Прибить" ненужную больше функцию TimerOn, запущенную в фоновом процессе.
# $! -- PID последнего процесса, запущенного в фоне.
sleep $TIMELIMIT && kill -s 14 $$ &
# Ждать 3 секунды, после чего выдать sigalarm сценарию.
trap Int14Vector 14 # переназначить процедуру обработки прерывания от таймера (14)
echo "Ваше любимое растение? "
# По общему признанию, это не очень хороший способ ограничения времени ожидания,
#+ однако опция "-t"команды "read" упрощает задачу.