system
system
Metoda nazywa program systemowy. Musisz podać polecenie jako argument ciągu dla tej metody. Na przykład:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
Program wywołany użyje prąd STDIN
, STDOUT
a STDERR
obiekty z programu Ruby. W rzeczywistości faktyczna wartość zwracana to albo true
, false
albo nil
. W przykładzie data została wydrukowana przez obiekt IO obiektu STDIN
. Metoda zwróci, true
jeśli proces zakończy się ze statusem zerowym, false
jeśli proces zakończy się ze statusem niezerowym i nil
jeśli wykonanie się nie powiedzie.
Innym efektem ubocznym jest to, że zmienna globalna $?
jest ustawiona na Process::Status
obiekt. Ten obiekt będzie zawierał informacje o samym wywołaniu, w tym identyfikator procesu (PID) wywoływanego procesu i status wyjścia.
>> system("date")
Wed Sep 4 22:11:02 CEST 2013
=> true
>> $?
=> #<Process::Status: pid 15470 exit 0>
Backticks
Backticks (``) wywołują program systemowy i zwracają jego wynik. W przeciwieństwie do pierwszego podejścia, polecenie nie jest przekazywane przez ciąg znaków, ale przez umieszczenie go w parze backticks.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
Zmienna globalna $?
jest również ustawiana za pomocą strzałek wstecznych. Za pomocą backticksa można również użyć interpolacji łańcuchów.
% x ()
Korzystanie %x
jest alternatywą dla stylu backticks. Zwróci również wynik. Podobnie jak jego krewni %w
i %q
(między innymi), dowolny ogranicznik będzie wystarczający, o ile pasują do niego ograniczniki. Oznacza to %x(date)
, %x{date}
i %x-date-
wszystkie są synonimami. Podobnie jak backticks %x
mogą korzystać z interpolacji łańcuchów.
exec
Przy użyciu Kernel#exec
bieżącego procesu (skryptu Ruby) zostaje zastąpiony procesem wywoływanym przez exec
. Metoda może przyjąć ciąg jako argument. W takim przypadku łańcuch będzie podlegał rozszerzeniu powłoki. W przypadku użycia więcej niż jednego argumentu pierwszy służy do wykonania programu, a następujące argumenty są podawane jako argumenty programu, który ma zostać wywołany.
Open3.popen3
Czasami wymagane informacje są zapisywane na standardowe dane wejściowe lub standardowe błędy i trzeba je również kontrolować. Tutaj Open3.popen3
przydaje:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end