sistema
O system
mé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
, STDOUT
e STDERR
objetos de seu programa Ruby. De fato, o valor de retorno real é ou true
, false
ou nil
. No exemplo, a data foi impressa através do objeto IO de STDIN
. O método retornará true
se o processo sair com um status zero, false
se o processo sair com um status diferente de zero e nil
se a execução falhar.
Outro efeito colateral é que a variável global $?
está definida como um Process::Status
objeto. 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 %w
e %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 %x
podem fazer uso de interpolação de string
exec
Usando Kernel#exec
o 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