от
Как позвонить команды оболочки внутри программы Ruby? Как мне потом сделать вывод из этих команд обратно в Рубин?

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста подтвердите адрес электронной почты.

21 Ответы

0 голосов
от
Как позвонить команды оболочки внутри программы Ruby? Как мне потом сделать вывод из этих команд обратно в Рубин?
0 голосов
от
Это объяснение основывается на прокомментированный скрипт на Ruby от друга. Если вы хотите улучшить сценарий, не стесняйтесь, чтобы обновить его по ссылке. Во-первых, обратите внимание, что когда Руби взывает к раковине, он обычно вызывает
/bin/sh
, а не Баш. Некоторые синтаксисе bash не поддерживается
/bin/sh
на всех системах. Вот несколько способов, чтобы выполнить скрипт:
cmd = "echo 'hi'" # Sample string that can be used
Kernel#`
, обычно называемые обратные апострофы –
`cmd`
Это как и многие другие языки, включая bash, PHP и Perl. Возвращает результат выполнения команды оболочки. Документы: http://ruby-doc.org/core/Kernel.html#method-i-60
value = `echo 'hi'`
value = `#{cmd}`
Встроенный синтаксис,
%x( cmd )
После
x
символ разделителя, которым может быть любой символ. Если разделитель-один из символов
(
,
[
,
{
, или
0 голосов
от
Вот схема, на основе этого ответа. Смотрите также, используя
script
для эмуляции терминала.
0 голосов
от
Как я люблю делать это с помощью
%x
литерал, который легко (и читается!) использовать кавычки в командной строке, вот так:
directorylist = %x[find . 

В данном случае, будет заполнять список файлов с все тестовые файлы в текущем каталоге, который можно обрабатывать, как ожидалось:

directorylist.each do |filename|
  filename.chomp!
  # work with file
end
0 голосов
от
Вот хорошая статья на мой взгляд о запуске скриптов на Ruby: "6 способов запускать команды оболочки в Ruby". Если вам нужно только получить использовать выходной обратные апострофы. Мне нужны более продвинутые вещи, как stdout и stderr, так что я использовал Open4 камень. У вас есть все методы, изложенные здесь.
0 голосов
от
Мой фаворит-Open3
  require "open3"

  Open3.popen3('nroff
0 голосов
от
Некоторые вещи, чтобы думать о При выборе между этими механизмами являются: Вы просто хотите stdout или вы также нужен поток stderr? или даже отделены? Насколько велик ваш выход? Вы хотите провести весь результат в памяти? Вы хотите, чтобы прочитать некоторые из ваших выход пока подпроцесс еще работает? Тебе нужны коды? Вам нужен объект Ruby, что представляет собой процесс и позволяет убить его по требованию? Возможно, Вам что-нибудь нужно от простого обратные апострофы (`), системы(), и
IO.popen
к полномасштабной
Kernel.fork
/
Kernel.exec
с
IO.pipe
и
IO.select
. Вы можете также хотеть бросить перерывы в смеси, если подпроцесс занимает слишком много времени для выполнения. К сожалению, очень многое зависит.
0 голосов
от
Еще один вариант: Когда вы: нужен поток stderr, а также стандартный вывод не можем/не будем использовать Open3/Open4 (они генерируют исключения в NetBeans на моем Mac, не знаю, почему) Вы можете использовать перенаправления консоли:
puts %x[cat bogus.txt].inspect
  =
0 голосов
от
Я определенно не эксперт в Ruby, но я дам ему шанс:
$ irb 
system "echo Hi"
Hi
=
0 голосов
от
В вышеуказанных ответах уже довольно большой, но я очень хочу поделиться следующим резюме статьи: "6 способов запускать команды оболочки в Рубине" В основном, он говорит нам:
Kernel#exec
:
exec 'echo "hello $HOSTNAME"'
system
и
$?
:
system 'false' 
puts $?
Обратные апострофы (`):
today = `date`
IO#popen
:
IO.popen("date") { |f| puts f.gets }
Open3#popen3
-- stdlib:
require "open3"
stdin, stdout, stderr = Open3.popen3('dc') 
Open4#popen4
-- Перл:
require "open4" 
pid, stdin, stdout, stderr = Open4::popen4 "false" # =
...