(или отсутствует).
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 и пр., то придется поискать соответствующие библиотеки или, быть может, написать свою собственную.
15.1. Разбор XML и REXML
Язык
Конечно, сорок лет назад XML был бы невозможен из-за ограничений на объем памяти. Но представим себе, что он появился бы тогда. Знаменитая проблема 2000 года, которой пресса уделяла так много внимания в 1999 году (хотя проблема-то и яйца выеденного не стоила!) при наличии XML вообще не возникла бы. Ведь причина была в том, что в унаследованных системах данные хранились в формате с фиксированной длиной. Так что, несмотря на некоторые недостатки, у XML есть сферы применения. В Ruby для работы с XML чаще всего применяется библиотека
Сразу отмечу, что REXML работает довольно медленно. Достаточно ли ее быстродействия для вашего конкретного приложения, решать вам. Не исключено, что со временем вам придется перейти на библиотеку libxml2 (которую мы здесь не рассматриваем). Она, конечно, работает очень быстро (поскольку написана на С), но, пожалуй, не так близка по духу к Ruby.