sistema
O systemmétodo chama um programa do sistema. Você deve fornecer o comando como um argumento de seqüência de caracteres para esse método. Por exemplo:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
O programa Chamado usará o atual STDIN, STDOUTe STDERRobjetos de seu programa Ruby. De fato, o valor de retorno real é ou true, falseou nil. No exemplo, a data foi impressa através do objeto IO de STDIN. O método retornará truese o processo sair com um status zero, falsese o processo sair com um status diferente de zero e nilse a execução falhar.
Outro efeito colateral é que a variável global $?está definida como um Process::Statusobjeto. Este objeto conterá informações sobre a chamada em si, incluindo o identificador do processo (PID) do processo chamado e o status da saída.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
Backticks
Os backticks (``) chamam um programa do sistema e retornam sua saída. Ao contrário da primeira abordagem, o comando não é fornecido por meio de uma string, mas colocando-o dentro de um par de reticulares.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
A variável global também $?é definida pelos backticks. Com backticks, você também pode usar a interpolação de strings.
% x ()
O uso %xé uma alternativa ao estilo dos backticks. Também retornará a saída. Como seus parentes %we %q(entre outros), qualquer delimitador será suficiente enquanto os delimitadores de colchetes corresponderem. Este meio %x(date), %x{date}e %x-date-são todos sinônimos. Como backticks %xpodem fazer uso de interpolação de string
exec
Usando Kernel#execo processo atual (seu script Ruby) é substituído pelo processo chamado exec. O método pode usar uma string como argumento. Nesse caso, a string estará sujeita à expansão do shell. Ao usar mais de um argumento, o primeiro é usado para executar um programa e o seguinte é fornecido como argumento para o programa a ser chamado.
Open3.popen3
Às vezes, as informações necessárias são gravadas na entrada ou erro padrão e você também precisa ter controle sobre elas. Aqui Open3.popen3é útil:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end