Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
# Для вычисления разницы в секундах между двумя моментами временами# bash вызывает Ruby...export time1="2007-04-02 15:56:12"export time2="2007-12-08 12:03:19"cat <<EOF | ruby | read elapsedrequire "parsedate"time1 = ENV["time1"]time2 = ENV["time2"]args1 = ParseDate.parsedate(time1)args2 = ParseDate.parsedate(time2)args1 = args1[0..5]args2 = args2[0..5]t1 = Time.local(*args1)t2 = Time.local(*args2)diff = t2 — t1puts diffEOFecho "Прошло секунд = " $elapsedВ данном случае оба исходных значения передаются в виде переменных окружения (которые необходимо экспортировать). Строки, читающие эти значения, можно было бы записать так:
time1="$time1" # Включить переменные оболочки непосредственноtime2="$time2" # в строку...Но возникающие при этом проблемы очевидны. Очень трудно понять, имеется ли в виду переменная bash или глобальная переменная Ruby. Возможна также путаница при экранировании и расстановке кавычек.
Флаг
-e#!/usr/bin/bashstring="Francis Bacon"ruby -e "puts '$string'.reverse" | read reversed# $reversed теперь равно "nocaB sicnarF"Знатоки UNIX заметят, что
awk14.9.3. Получение и установка кодов завершения
Метод
exitSystemExitKernelexit!# ...if (all_OK) exit # Нормально (0).else exit! # В спешке (-1).endКогда операционная система печатает возвращенный Ruby код (например, выполнив команду
echo $?wait2waitpid2child = fork { sleep 1; exit 3 }pid, code = Process.wait2 # [12554,768]status = code << 8 #314.9.4. Работает ли Ruby в интерактивном режиме?
Чтобы узнать, работает ли программа в интерактивном режиме, нужно проверить стандартный ввод. Метод
isatty?trueif STDIN.isatty? puts "Привет! Я вижу, вы печатаете" puts "на клавиатуре."else puts "Входные данные поступают не с клавиатуры."end14.9.5. Определение текущей платформы или операционной системы
Если программа хочет знать, в какой операционной системе исполняется, то может опросить глобальную константу
RUBY_PLATFORMi386-cygwinsparc-solaris2.7Поскольку мы в основном работаем с вариантами UNIX (Solaris, AIX, Linux) и Windows (98, NT, 2000, XP), то считаем полезным следующий очень грубый код. Он отличает UNIX от Windows (бесцеремонно отправляя всех остальных в категорию «прочие»).
def os_family case RUBY_PLATFORM when /ix/i, /ux/i, /gnu/i, /sysv/i, /solaris/i, /sunos/i, /bsd/i "unix" when /win/i, /ming/i "windows" else "other" endendЭтот небольшой набор регулярных выражений корректно распознает абсолютное большинство платформ. Конечно, это весьма неуклюжий способ обработки системных зависимостей. Даже если вы правильно определите семейство ОС, отсюда еще не следует, что нужная вам функциональность имеется (или отсутствует).
14.9.6. Модуль Etc
Модуль
Etc/etc/passwd/etc/groupМетод
getlogingetpwuiduid
