Jaka jest różnica między następującymi metodami Ruby?
exec
, system
I %x()
czy backticks
Wiem, że są one używane do programowego wykonywania poleceń terminalowych za pośrednictwem Ruby, ale chciałbym wiedzieć, dlaczego istnieją trzy różne sposoby, aby to zrobić.
sh
.Odpowiedzi:
system
system
Metoda nazywa program systemowy. Musisz podać polecenie jako argument ciągu dla tej metody. Na przykład:Program wywołany użyje prąd
STDIN
,STDOUT
aSTDERR
obiekty z programu Ruby. W rzeczywistości faktyczna wartość zwracana to albotrue
,false
albonil
. W przykładzie data została wydrukowana przez obiekt IO obiektuSTDIN
. Metoda zwróci,true
jeśli proces zakończy się ze statusem zerowym,false
jeśli proces zakończy się ze statusem niezerowym inil
jeśli wykonanie się nie powiedzie.Innym efektem ubocznym jest to, że zmienna globalna
$?
jest ustawiona naProcess::Status
obiekt. Ten obiekt będzie zawierał informacje o samym wywołaniu, w tym identyfikator procesu (PID) wywoływanego procesu i status wyjścia.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.
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 przezexec
. 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:źródło
STDIN
,STDOUT
,STDERR
, należy rozważyćOpen3.popen3
zamiast; np. patrz stackoverflow.com/a/10922097/258662Oto schemat blokowy oparty na tej odpowiedzi . Zobacz także: używanie
script
do emulacji terminala .źródło
Robią różne rzeczy.
exec
zastępuje bieżący proces nowym procesem i nigdy nie powraca .system
wywołuje inny proces i zwraca jego wartość wyjściową do bieżącego procesu. Użycie backticks wywołuje inny proces i zwraca wynik tego procesu do bieżącego procesu.źródło