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

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

Жанры

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

14.3.2. Дополнительные замечания по поводу библиотеки shell.rb

Метод

transact
исполняет блок в контексте вызывающего объекта. Таким образом, допустима следующая сокращенная запись:

sh = Shell.new

sh.transact do

 echo("Строка данных") > "somefile.txt"

 cat("somefile.txt","otherfile.txt") > "thirdfile"

 cat("thirdfile") | tee("file4") > STDOUT

end

Итератор

foreach
принимает в качестве параметра файл или каталог. Если это файл, он перебирает все его строки, а если каталог — все имена файлов в нем.

sh = Shell.new

# Напечатать все строки файла /tmp/foo.

sh.foreach("/tmp/foo") {|l| puts l }

# Вывести список файлов в каталоге /tmp.

sh.foreach("/tmp") {|f| puts f }

Метод

pushdir
запоминает текущий каталог, а метод
popdir
делает последний запомненный каталог текущим. У них есть синонимы
pushd
и
popd
. Метод
pwd
возвращает текущий рабочий каталог, его синонимы —
getwd
,
cwd
и
dir
.

sh = Shell.cd "/home"

puts sh.pwd # /home

sh.pushd "/tmp"

puts sh.pwd # /tmp

sh.popd

puts sh.pwd # /home

Для удобства в класс

Shell
импортируются методы из различных источников, в том числе из класса
File
, модуля
FileTest
и библиотеки
ftools.rb
. Это избавляет от необходимости выполнять
require
,
include
, создавать объекты, квалифицировать вызовы методов и т. д.

sh = Shell.new

flag1 = sh.exist? "myfile" # Проверить существование файла.

sh.delete "somefile" # Удалить файл.

sh.move "/tmp/foo", "/tmp/bar" # Переместить файл.

У библиотеки

Shell
есть и другие возможности, которые мы здесь не рассматриваем. Дополнительную информацию ищите в документации.

14.4. Переменные окружения

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

Переменные окружения широко применяются в ОС UNIX. Система Windows (а еще раньше MS-DOS) позаимствовала эту идею у UNIX, поэтому приведенные ниже коды будут работать на обеих платформах.

14.4.1. Чтение и установка переменных окружения

Глобальная константа

ENV
— это хэш, с помощью которого можно читать и изменять переменные окружения. В примере ниже мы читаем значение переменной
PATH
, (в Windows вместо двоеточия нужно употреблять точку с запятой):

bypath = ENV["PATH"]

# А теперь получим массив...

dirs = mypath.split(":")

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

ENV["alpha"] = "123"

ENV["beta"] = "456"

puts "Родитель: alpha = #{env['alpha']}"

puts "Родитель: beta = #(env['beta']}"

fork do # Код потомка...

 x = ENV["alpha"]

 ENV["beta"] = "789"

 y = ENV["beta"]

 puts " Потомок: alpha = #{x}"

 puts " Потомок: beta = #{y}"

end

Process.wait

a = ENV["alpha"]

b = ENV["beta"]

puts "Родитель: alpha = #{a}"

puts "Родитель: beta = #{b}"

Программа выводит следующие строки:

Родитель: alpha = 123

Родитель: beta = 456

 Потомок: alpha = 123

 Потомок: beta = 789

Родитель: alpha = 123

Родитель: beta = 456

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

14.4.2. Хранение переменных окружения в виде массива или хэша

Важно понимать, что объект

ENV
— не настоящий хэш, а лишь выглядит как таковой. Например, мы не можем вызвать для него метод
invert
; будет возбуждено исключение
NameError
, поскольку такого метода не существует. Причина такой реализации в том, что существует тесная связь между объектом
ENV
и операционной системой; любое изменение хранящихся в нем значений отражается на состоянии ОС, а такое поведение с помощью простого хэша не смоделируешь.

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

Неудержимый. Книга XVIII

Боярский Андрей
18. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга XVIII

Кодекс Охотника. Книга XVII

Винокуров Юрий
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVII

Газлайтер. Том 26

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

Вперед в прошлое 11

Ратманов Денис
11. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 11

Лихие. Смотрящий

Вязовский Алексей
2. Бригадир
Фантастика:
попаданцы
5.00
рейтинг книги
Лихие. Смотрящий

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

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

Газлайтер. Том 21

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

Играть... в тебя

Зайцева Мария
3. Звериные повадки Симоновых
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Играть... в тебя

Искатель 4

Шиленко Сергей
4. Валинор
Фантастика:
рпг
фэнтези
попаданцы
5.00
рейтинг книги
Искатель 4

Ермак. Телохранитель

Валериев Игорь
2. Ермак
Фантастика:
альтернативная история
7.50
рейтинг книги
Ермак. Телохранитель

Темные тропы и светлые дела

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

Кодекс Крови. Книга I

Борзых М.
1. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга I

Кодекс Охотника. Книга XIV

Винокуров Юрий
14. Кодекс Охотника
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XIV

Уникум

Поселягин Владимир Геннадьевич
1. Уникум
Фантастика:
альтернативная история
4.60
рейтинг книги
Уникум