system
Метод system
вызывает системную программу.Вы должны предоставить команду в качестве строкового аргумента для этого метода.Например:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
Вызванная программа будет использовать текущие объекты STDIN
, STDOUT
и STDERR
вашей программы Ruby.Фактически, фактическое возвращаемое значение равно либо true
, false
, либо nil
.В этом примере дата была напечатана через объект ввода-вывода STDIN
.Метод вернет true
, если процесс завершился с нулевым состоянием, false
, если процесс завершился с ненулевым состоянием, и nil
, если выполнение не удалось.
Еще один побочный эффект заключается в том, чтоГлобальная переменная $?
установлена в объект Process::Status
.Этот объект будет содержать информацию о самом вызове, включая идентификатор процесса (PID) вызванного процесса и состояние выхода.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
Backticks
Backticks (``) вызывает системную программу и возвращает ее вывод.В отличие от первого подхода, команда предоставляется не через строку, а путем помещения ее в пару обратных символов.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
Глобальная переменная $?
также устанавливается через обратные ссылки.С обратными галочками вы также можете использовать интерполяцию строк.
% x ()
Использование %x
является альтернативой стилю обратных тегов.Он также вернет вывод.Как и его родственники %w
и %q
(среди прочих), любой разделитель будет достаточным, если разделители в скобках совпадают.Это означает, что %x(date)
, %x{date}
и %x-date-
являются синонимами.Подобно обратным меткам %x
может использовать интерполяцию строк.
exec
Используя Kernel#exec
текущий процесс (ваш скрипт на Ruby)заменяется процессом, вызванным через exec
.Метод может принимать строку в качестве аргумента.В этом случае строка будет подвержена расширению оболочки.Если используется более одного аргумента, то первый используется для выполнения программы, и в качестве аргументов для вызываемой программы предоставляются следующие параметры:
Open3.popen3
Иногда необходимая информация записывается в стандартный ввод или в стандартную ошибку, и вам также необходимо получить контроль над ними.Здесь Open3.popen3
пригодится:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end