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

14.1.1. Методы system и exec

14.1.1. Методы system и exec

Метод system (из модуля Kernel) эквивалентен одноименной функции из библиотеки языка С. Он выполняет указанную команду в отдельной оболочке.

system("/usr/games/fortune")
# Вывод направляется, как обычно, на stdout...

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

system("rm", "/tmp/file1")
system("rm /tmp/file2")
# Оба варианта годятся.
# А тут есть различие...
system("echo *")   # Печатается список всех файлов.
system("echo","*") # Печатается звездочка (расширение
                   # имени файла не производится).
# Более сложные командные строки тоже работают.
system("ls -l | head -n |")

Посмотрим, как это будет работать в семействе операционных систем Windows. В случае с простой исполняемой программой поведение должно быть таким же, как в UNIX. В зависимости от варианта Ruby для вызова встроенных в оболочку команд может потребоваться запуск cmd.ехе  — интерпретатора команд в Windows (в некоторых версиях ОС он называется command.com). Ниже приведены примеры запуска внешней и встроенной команды:

system("notepad.ехе","myfile.txt") # Никаких проблем...
system("cmd /с dir","somefile")    # 'dir' - встроенная команда!

Другое решение — воспользоваться библиотекой Win32API и определить собственный вариант метода system.

require "Win32API"
def system(cmd)
 sys = Win32API.new("crtdll", "system", ['P'], 'L')
 sys.Call(cmd)
end
system("dir") # cmd /с необязательно!

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

Упомяну еще метод exec. Он ведет себя аналогично system с тем отличием, что новый процесс замещает текущий. Поэтому код, следующий за exec, исполняться не будет.

puts "Содержимое каталога:"
exec("ls", "-l")
puts "Эта строка никогда не исполняется!"

Оглавление книги


Генерация: 3.549. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз