Qual é a diferença entre os seguintes métodos Ruby?
exec
, system
e %x()
ou Backticks
Eu sei que eles são usados para executar comandos de terminal programaticamente via Ruby, mas eu gostaria de saber por que existem três maneiras diferentes de fazer isso.
sh
.Respostas:
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:O programa Chamado usará o atual
STDIN
,STDOUT
eSTDERR
objetos de seu programa Ruby. De fato, o valor de retorno real é outrue
,false
ounil
. No exemplo, a data foi impressa através do objeto IO deSTDIN
. O método retornarátrue
se o processo sair com um status zero,false
se o processo sair com um status diferente de zero enil
se a execução falhar.Outro efeito colateral é que a variável global
$?
está definida como umProcess::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.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.
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 stringexec
Usando
Kernel#exec
o processo atual (seu script Ruby) é substituído pelo processo chamadoexec
. 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:fonte
STDIN
,STDOUT
,STDERR
, considereOpen3.popen3
vez; por exemplo, veja stackoverflow.com/a/10922097/258662Aqui está um fluxograma com base nesta resposta . Veja também, usando
script
para emular um terminal .fonte
Eles fazem coisas diferentes.
exec
substitui o processo atual pelo novo processo e nunca retorna .system
chama outro processo e retorna seu valor de saída para o processo atual. O uso de backticks chama outro processo e retorna a saída desse processo para o processo atual.fonte