logo search
Программирование на языке Ruby

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 "Эта строка никогда не исполняется!"