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

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

Жанры

Программирование на языке 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
.

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

Тихие ночи

Владимиров Денис
2. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Тихие ночи

Адвокат империи

Карелин Сергей Витальевич
1. Адвокат империи
Фантастика:
городское фэнтези
попаданцы
фэнтези
5.75
рейтинг книги
Адвокат империи

Сокрушитель

Поселягин Владимир Геннадьевич
3. Уникум
Фантастика:
боевая фантастика
5.60
рейтинг книги
Сокрушитель

Император Пограничья 1

Астахов Евгений Евгеньевич
1. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 1

Телохранитель Цесаревны

Зот Бакалавр
5. Герой Империи
Фантастика:
фэнтези
боевая фантастика
5.25
рейтинг книги
Телохранитель Цесаревны

Глэрд VIII: Базис 2

Владимиров Денис
8. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Глэрд VIII: Базис 2

Стеллар. Трибут

Прокофьев Роман Юрьевич
2. Стеллар
Фантастика:
боевая фантастика
рпг
8.75
рейтинг книги
Стеллар. Трибут

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Родословная. Том 1

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

Патрульный

Поселягин Владимир Геннадьевич
2. Наемник
Фантастика:
боевая фантастика
космическая фантастика
8.42
рейтинг книги
Патрульный

Мастер 9

Чащин Валерий
9. Мастер
Фантастика:
боевая фантастика
попаданцы
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
Мастер 9

Егерь Ладов

Шелег Дмитрий Витальевич
3. Кровь и лёд
Фантастика:
боевая фантастика
аниме
фэнтези
5.00
рейтинг книги
Егерь Ладов

Глава рода

Шелег Дмитрий Витальевич
5. Живой лёд
Фантастика:
боевая фантастика
6.55
рейтинг книги
Глава рода

Убивать, чтобы жить

Бор Жорж
1. УЧЖ
Фантастика:
героическая фантастика
боевая фантастика
рпг
5.00
рейтинг книги
Убивать, чтобы жить