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

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

Жанры

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

С константой

ARGF
ассоциирован метод
file
— он возвращает объект
IO
, соответствующий файлу, обрабатываемому в данный момент. Естественно, возвращаемое значение изменяется по мере перехода от одного файла к другому.

А если мы не хотим интерпретировать имена аргументов в командной строке как имена файлов? Тогда не надо обращаться к методам ввода без указания вызывающего объекта. Если вы хотите читать из стандартного ввода, укажите в качестве такого объекта

STDIN
, и все будет работать правильно.

14.2.3. Константа ARGV

Глобальная

константа
ARGV
представляет список аргументов, переданных в командной строке. По сути дела, это массив.

n = ARGV.size

argstr = '"' + ARGV*"," + '"'

puts "Мне было передано аргументов: #{n}..."

puts "Вот они: #{argstr}"

puts "Заметьте, что ARGV[0] = #{ARGV[0]}"

Если запустить эту программу с аргументами

red green blue
, то она напечатает:

Мне было передано аргументов: 3...

Вот они: "red,green,blue"

Заметьте, что ARGV[0] = red

Ясно, что отдельно передавать число аргументов, как в былые времена, не нужно; эта информация — часть массива.

Привычных к старым соглашениям программистов может смутить также тот факт, что нулевой элемент массива — настоящий аргумент (а не, скажем, имя сценария). Нумерация аргументов начинается с нуля, а не с единицы, как в языке С и в различных интерпретаторах команд.

14.3. Библиотека Shell

Не всегда Ruby удобен в качестве языка сценариев. Например, в языке bash для запуска внешней программы достаточно просто указать ее имя безо всякого дополнительного синтаксиса.

Оборотной стороной мощи и гибкости Ruby является более сложный синтаксис. Кроме того, функциональность разнесена по различным классам, модулям и библиотекам.

Это послужило основанием для создания библиотеки

Shell
, которая упрощает, к примеру, организацию конвейеров команд и перенаправление вывода в файл. Кроме того, она сводит воедино функциональность из разных источников, скрывая ее за интерфейсом объекта
Shell
. (На платформе Windows эта библиотека работает не во всех случаях.)

14.3.1. Использование библиотеки Shell для перенаправления ввода/вывода

В классе

Shell
для создания объектов есть два метода:
new
и
cd
. Первый создает объект, ассоциированный с текущим каталогом, второй — объект, для которого рабочим будет указанный каталог.

require "shell"

sh1 = Shell.new # Работать в текущем каталоге.

sh2 = Shell.cd("/tmp/hal") # Работать в каталоге /tmp/hal.

Библиотека

Shell
определяет несколько встроенных команд (например,
echo
,
cat
и
tee
) в виде методов. Они всегда возвращают объекты класса
Filter
(как и определяемые пользователем команды, с которыми мы вскоре познакомимся).

Класс

Filter
понимает, что такое перенаправление ввода/вывода. В нем определены
методы (или операторы)
<
,
>
и
|
, которые ведут себя примерно так, как мы ожидаем по многолетнему опыту написания shell-сценариев.

Если методу перенаправления передать в качестве параметра строку, то она будет считаться именем файла. Если же параметром является объект

IO
, он используется для операций ввода/вывода. Примеры:

sh = Shell.new

# Вывести файл motd на stdout.

sh.cat("/etc/motd") > STDOUT

# Напечатать его еще раз.

(sh.cat < "/etc/motd") > STDOUT

(sh.echo "Это тест") > "myfile.txt"

# Добавить строку в конец файла /etc/motd.

sh.echo("Hello, world!") >> "/etc/motd"

# Вывести два файла на stdout и продублировать (tee) вывод в третий файл.

(sh.cat "file1" "file2") | (tee "file3") > STDOUT

Отметим, что у оператора

>
высокий приоритет. Скобки, которые вы видите в данном примере, в большинстве случаев обязательны. Вот два примера правильного использования и один — неправильного:

# Интерпретатор Ruby понимает такую конструкцию...

sh.cat("myfile.txt") > STDOUT

# ...и такую тоже.

(sh.cat "myfile.txt") > STDOUT

# TypeError! (ошибка связана с приоритетами).

sh.cat "myfile.txt" > STDOUT

Отметим еще, что можно «инсталлировать» системные команды по своему выбору. Для этого служит метод

def_system_command
. Ниже определяются два метода:
ls
и
ll
, которые выводят список файлов в текущем каталоге (в коротком и длинном формате).

# Имя метода совпадает с именем команды...

# Необходим только один параметр:

Shell.def_system_command "ls"

# А здесь должно быть два параметра:

Shell.def_system_command "ll", "ls -l"

sh = Shell.new

sh.ls > STDOUT # Короткий формат.

sh.ll > STDOUT # Длинный формат.

Вы, наверное, обратили внимание на то, что в большинстве случаев мы явно отправляем вывод объекту

STDOUT
. Связано это с тем, что объект
Shell
автоматически вывод команд никуда не направляет. Он просто ассоциирует его с объектом
Filter
, который уже может быть связан с файлом или с объектом
IO
.

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

Созвездие эректуса

Розов Александр Александрович
5. Конфедерация Меганезия
Фантастика:
фэнтези
5.00
рейтинг книги
Созвездие эректуса

Трактат об электричестве и магнетизме

Максвелл Джеймс Клерк
146. Классики науки
Научно-образовательная:
прочая научная литература
физика
5.00
рейтинг книги
Трактат об электричестве и магнетизме

Вечный. Книга V

Рокотов Алексей
5. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга V

Лимеренция

Долорес Х. К.
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Лимеренция

Сборник "Пендергаст". Компиляция. Книги 1-18"

Престон Дуглас
Пендергаст
Детективы:
триллеры
прочие детективы
5.00
рейтинг книги
Сборник Пендергаст. Компиляция. Книги 1-18

Черный Маг Императора 19

Герда Александр
19. Черный маг императора
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Черный Маг Императора 19

Одиссея капитана Балка. Дилогия

Чернов Александр Викторович
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Одиссея капитана Балка. Дилогия

Спящие красавицы

Кинг Оуэн
Фантастика:
ужасы и мистика
5.00
рейтинг книги
Спящие красавицы

Библия G-модератора

Гламаздин Виктор Викторович
Научно-образовательная:
психология
5.00
рейтинг книги
Библия G-модератора

Ох уж этот Мин Джин Хо 5

Кронос Александр
5. Мин Джин Хо
Фантастика:
попаданцы
дорама
5.00
рейтинг книги
Ох уж этот Мин Джин Хо 5

Товарищ "Чума"

lanpirot
1. Товарищ "Чума"
Фантастика:
попаданцы
альтернативная история
4.00
рейтинг книги
Товарищ Чума

"Зарубежная фантастика 2024-2". Компиляция. Книги 1-18

Гудкайнд Терри
Зарубежная фантастика 2024
Фантастика:
боевая фантастика
фэнтези
5.00
рейтинг книги
Зарубежная фантастика 2024-2. Компиляция. Книги 1-18

Имперец. Том 4

Романов Михаил Яковлевич
3. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Имперец. Том 4

Заветы Ильича. «Сим победиши»

Логинов Владлен Терентьевич
Научно-образовательная:
история
политика
6.25
рейтинг книги
Заветы Ильича. «Сим победиши»