В чем разница между следующими методами Ruby?
exec
, system
И %x()
или Обратные кавычки
Я знаю, что они используются для программного выполнения команд терминала через Ruby, но я хотел бы знать, почему есть три различных способа сделать это.
В чем разница между следующими методами Ruby?
exec
, system
И %x()
или Обратные кавычки
Я знаю, что они используются для программного выполнения команд терминала через Ruby, но я хотел бы знать, почему есть три различных способа сделать это.
Ответы:
система
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>
Обратные кавычки
Обратные знаки (``) вызывают системную программу и возвращают ее вывод. В отличие от первого подхода, команда предоставляется не через строку, а путем помещения ее в пару обратных символов.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
Глобальная переменная также $?
устанавливается с помощью обратных кавычек. С помощью обратных галочек вы также можете использовать интерполяцию строк.
%Икс()
Использование %x
является альтернативой стилю backticks. Он также вернет вывод. Как и его родственники %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
STDIN
, STDOUT
, STDERR
, рассмотреть Open3.popen3
вместо; например, см. stackoverflow.com/a/10922097/258662
Вот блок-схема, основанная на этом ответе . Смотрите также, используя script
для эмуляции терминала .
Они делают разные вещи. exec
заменяет текущий процесс новым процессом и никогда не возвращается . system
вызывает другой процесс и возвращает его значение выхода текущему процессу. Использование обратных галочек вызывает другой процесс и возвращает результат этого процесса текущему процессу.