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

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

child = fork { sleep 1; exit 3 }

pid, code = Process.wait2 # [12554,768]

status = code << 8 #3

14.9.4. Работает ли Ruby в интерактивном режиме?

Чтобы узнать, работает ли программа в интерактивном режиме, нужно проверить стандартный ввод. Метод

isatty?
возвращает
true
, если устройство интерактивное, а не диск или сокет. (Для Windows этот метод не реализован.)

if STDIN.isatty?

 puts "Привет!
Я вижу, вы печатаете"

 puts "на клавиатуре."

else

 puts "Входные данные поступают не с клавиатуры."

end

14.9.5. Определение текущей платформы или операционной системы

Если программа хочет знать, в какой операционной системе исполняется, то может опросить глобальную константу

RUBY_PLATFORM
. В ответ будет возвращена загадочная строка (что-то вроде
i386-cygwin
или
sparc-solaris2.7
), содержащая информацию о платформе, для которой был собран интерпретатор Ruby.

Поскольку мы в основном работаем с вариантами 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"

 end

end

Этот небольшой набор регулярных выражений корректно распознает абсолютное большинство платформ. Конечно, это весьма неуклюжий способ обработки системных зависимостей. Даже если вы правильно определите семейство ОС, отсюда еще не следует, что нужная вам функциональность имеется (или отсутствует).

14.9.6. Модуль Etc

Модуль

Etc
получает различную информацию из файлов
/etc/passwd
и
/etc/group
. Понятно, что полезен он только на платформе UNIX.

Метод

getlogin
возвращает имя пользователя, от имени которого запущена программа. Если он завершается неудачно, может помочь метод
getpwuid
(принимающий в качестве необязательного параметра идентификатор пользователя
uid
).

myself = getlogin # hal9000

myname = getpwuid(2001).name # hal9000

# Если параметр не задан, getpwuid вызывает getuid...

me2 = getpwuid.name # hal9000

Метод

getpwnam
возвращает структуру
passwd
, которая содержит поля
name
,
dir
(начальный каталог),
shell
(начальный интерпретатор команд) и др.

rootshell = getpwnam("root").shell # /sbin/sh

Методы

getgrgid
и
getgrnam
ведут себя аналогично, но по отношению к группам. Они возвращают структуру
group
, содержащую имя группы и т.д.

Итератор

passwd
обходит все записи в файле
/etc/passwd
. Запись передается в блок в виде структуры
passwd
.

all_users = []

passwd { |entry| all_users << entry.name }

Имеется также итератор group для обхода записей в файле

/etc/group
.

14.10. Заключение

На этом мы завершаем обсуждение применения Ruby для решения рутинных задач автоматизации. Мы видели, как передавать в программу и получать от нее информацию в виде переменных окружения и с помощью стандартного ввода/вывода. Мы познакомились с типичными операциями «склеивания», позволяющими разным программам взаимодействовать. Рассмотрели мы и различные уровни взаимодействия с операционной системой.

Поскольку значительная часть изложенного материала системно зависима, я призываю вас экспериментировать. Между платформами Windows и UNIX имеются серьезные отличия. Есть они и между разными операционными системами, относящимися к одному семейству.

Следующая тема, которую мы рассмотрим, тоже весьма широка. Речь пойдет о работе с данными в разных форматах, от графических до XML.

Глава 15. Ruby и форматы данных

— Ваша информация, сэр, — говорит Библиотекарь.

— Сможешь увязать эту информацию с утилитой «ВЫ ЗДЕСЬ»? — говорит Хиро.

— Я посмотрю, что можно сделать, сэр. Форматы представляются совместимыми.

Нил Стивенсон, «Лавина»

В этой главе мы расскажем обо всем понемножку. Значительную часть материала можно было бы поместить и в другое место. Не все рассмотренные вопросы одинаковы по важности и сложности, но каждому из них стоит уделить внимание.

В программировании так уж получается, что по мере усложнения какой-то информации для ее описания вырабатывается отдельный «мини-язык», а чаще даже несколько таких языков. Мы называем их форматами файлов или данных.

Любой из вас припомнит сотни примеров форматов файлов. Это и графические форматы типа JPG, GIF и PNG, и форматы документов (RTF и PDF), и «универсальные» форматы (CSV, XML или YAML) и бесчисленные форматы, разработанные отдельными компаниями, многие из которые являются просто вариациями на тему хранения данных в виде таблицы с фиксированной шириной колонок, столь популярного в древние времена (я имею в виду 1960-е годы).

Один из самых простых и наиболее употребительных форматов данных — обычный текст. Но даже на такой формат можно наложить ту или иную структуру (отсюда и популярность XML). Бывают также чисто двоичные и двоично-текстовые форматы. В принципе можно было бы разработать «иерархию» форматов, подобную сетевой модели ISO, в которой информация представляется по-разному на разных уровнях протоколов.

Но в каком бы формате данные ни хранились, рано или поздно их придется читать, разбирать и снова сохранять. В этой главе мы рассмотрим лишь несколько самых распространенных форматов файлов; в одной книге невозможно охватить все существующие. Если вы хотите разбирать файлы в таких форматах, как vCard, iCal и пр., то придется поискать соответствующие библиотеки или, быть может, написать свою собственную.

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

Дорога Короля

Пратчетт Терри Дэвид Джон
Фантастика:
фэнтези
5.00
рейтинг книги
Дорога Короля

В тени завтрашнего дня

Хейзинга Йохан
Научно-образовательная:
культурология
5.00
рейтинг книги
В тени завтрашнего дня

Законник Российской Империи

Ткачев Андрей Юрьевич
1. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Законник Российской Империи

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
АН (цикл 11 книг)

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.50
рейтинг книги
Дважды одаренный. Том VI

Танцы на снегу

Лукьяненко Сергей Васильевич
2. Геном
Фантастика:
научная фантастика
9.23
рейтинг книги
Танцы на снегу

Точка Бифуркации XII

Смит Дейлор
12. ТБ
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Точка Бифуркации XII

Место под солнцем

Марклунд Лиза
Анника Бенгтзон
Детективы:
криминальные детективы
6.00
рейтинг книги
Место под солнцем

Первопроходец

Астахов Евгений Евгеньевич
10. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
фэнтези
5.00
рейтинг книги
Первопроходец

Тень в зеркале

Ирвин Ян
1. Сказания трех миров
Фантастика:
фэнтези
7.38
рейтинг книги
Тень в зеркале

Сексуальная жизнь мужчины. Книга 1

Еникеева Диля Дэрдовна
Дом и Семья:
образовательная литература
здоровье и красота
7.00
рейтинг книги
Сексуальная жизнь мужчины. Книга 1

Шайтан Иван 6

Тен Эдуард
6. Шайтан Иван
Фантастика:
попаданцы
альтернативная история
историческое фэнтези
7.50
рейтинг книги
Шайтан Иван 6

Ангел пролетел

Устинова Татьяна
Любовные романы:
5.00
рейтинг книги
Ангел пролетел

Найти себя

Иванович Юрий
1. Магия - наше будущее. Раб из нашего времени
Фантастика:
боевая фантастика
8.08
рейтинг книги
Найти себя