В наши дни трудно найти человека, который помнил бы командную строку MS-DOS, но основные принципы работы с ней стоят того, чтобы их знать. Как одно из усовершенствований можно было бы реализовать вывод эквивалентной команды в Unix или Linux перед фактическим выполнением, и затем, после нескольких вызовов, сценарий мог бы просто показывать эквивалентную команду, но не выполнять ее. В этом случае пользователь будет вынужден запоминать новые команды, чтобы добиться желаемого!
№ 21. Вывод времени в разных часовых поясах
Основное требование, предъявляемое к команде date, — отображение даты и времени для часового пояса, настроенного в системе. Но как быть пользователям в дальней поездке, пересекающим несколько часовых поясов? Или тем, у кого есть друзья и коллеги, живущие в других уголках планеты, и им хотелось бы знать, который сейчас час, например, в Касабланке, Ватикане или Сиднее?
Как оказывается, команда date в большинстве современных разновидностей Unix опирается в своей работе на базу данных часовых поясов. Обычно хранящаяся в каталоге
$ TZ="Africa/Casablanca" date
Fri Apr 7 16:31:01 WEST 2017
Однако большинству пользователей неудобно временно подменять значения переменных окружения. Написав сценарий командной оболочки, можно реализовать более дружественный интерфейс к базе данных часовых поясов.
Бо́льшая часть сценария в листинге 2.19 связана с базой данных часовых поясов (которая обычно хранится в виде нескольких файлов в каталоге
Код
Листинг 2.19. Сценарий timein для вывода времени в определенном часовом поясе
··#!/bin/bash
··# timein — выводит текущее время в указанном часовом поясе или
··#·· географической области. При вызове без аргументов выводит время
··#·· UTC/GMT. Используйте слово "list", чтобы вывести список всех известных
··#·· географических областей.
··#·· Обратите внимание, что сценарий может находить совпадения с каталогами
··#·· часовых поясов (областей), но действительными спецификациями являются
··#·· только файлы (города).
··#·· Ссылка на базу данных часовых поясов: http://www.twinsun.com/tz/tz-link.htm
··zonedir="/usr/share/zoneinfo"
··if [! -d $zonedir]; then
····echo "No time zone database at $zonedir." >&2
····exit 1
··fi
··if [-d "$zonedir/posix"]; then
····zonedir=$zonedir/posix # Modern Linux systems
··fi
··if [$# −eq 0]; then
····timezone="UTC"
····mixedzone="UTC"
····(echo "All known time zones and regions defined on this system: "
······cd $zonedir
······find−L * −type f −print | xargs −n 2 | \
········awk '{ printf " %-38s %-38s\n", $1, $2 }'
····) | more
····exit 0
··else
····region="$(dirname $1)"
····zone="$(basename $1)"
····# Заданный часовой пояс имеет прямое соответствие? Если да, можно продолжать.