Ruby, różnica między exec, system I %x () lub Backticks
Jaka jest różnica między następującymi metodami Ruby?
exec
, system
and %x()
or Backticks
Wiem, że są one używane do programowego wykonywania poleceń terminala przez Ruby, ale chciałbym wiedzieć, dlaczego są trzy różne sposoby, aby to zrobić.
3 answers
System
The system
metoda wywołuje program systemowy. Musisz podać polecenie jako argument Łańcuchowy tej metody. Na przykład:
>> system("date")
Wed Sep 4 22:03:44 CEST 2013
=> true
Wywołany program będzie używał bieżącego STDIN
, STDOUT
i STDERR
obiekty Twojego programu Ruby. W rzeczywistości rzeczywista wartość zwracana jest albo true
, false
lub nil
. W przykładzie data została wydrukowana przez obiekt IO STDIN
. Metoda zwróci true
, jeśli proces zakończy się ze stanem zerowym, false
jeśli proces zakończył działanie ze statusem niezerowym i nil
jeśli wykonanie nie powiodło się.
Innym efektem ubocznym jest to, że zmienna globalna $?
jest ustawiona na Process::Status
obiekt. Obiekt ten będzie zawierał informacje o samym wywołaniu, w tym identyfikator procesu (PID) wywoływanego procesu oraz status zakończenia.
>> 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 wyjście. W przeciwieństwie do pierwszego podejścia, polecenie nie jest dostarczane przez ciąg znaków, ale przez umieszczenie go wewnątrz pary backticks.
>> `date`
=> Wed Sep 4 22:22:51 CEST 2013
Zmienna globalna {[15] } jest również ustawiana przez backticki. Z backticks można również użyć interpolacji łańcuchów.
%x()
Użycie {[18] } jest alternatywą dla stylu backticks. Zwróci również wyjście. Podobnie jak jego krewni %w
i %q
(między innymi), każdy ogranicznik wystarczy, o ile ograniczniki w stylu nawiasów pasują. Oznacza to %x(date)
, %x{date}
i %x-date-
to wszystkie synonimy. Podobnie jak backticks %x
może używać interpolacji łańcuchów.
Exec
Za pomocą Kernel#exec
bieżący proces (Twój skrypt Ruby) jest zastępowany procesem wywołanym przez exec
. Metoda może przyjmować łańcuch znaków jako argument. W tym przypadku łańcuch będzie podlegał rozszerzeniu powłoki. Przy użyciu więcej niż jednego argumentu, wtedy pierwszy z nich jest używany do wykonania programu, a następujące są dostarczane jako argumenty do program do wywołania.
Open3.popen3
Czasami wymagane informacje są zapisywane do standardowego wejścia lub standardowego błędu i musisz mieć nad nimi kontrolę. Proszę.Open3.popen3
przydaje się:
require 'open3'
Open3.popen3("curl http://example.com") do |stdin, stdout, stderr, thread|
pid = thread.pid
puts stdout.read.chomp
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-20 14:08:39
Oto schemat blokowy oparty na tej odpowiedzi . Zobacz także, używanie script
do emulowania terminala.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:20
Robią różne rzeczy. exec
zastępuje bieżący proces nowym i nigdy nie zwraca . system
wywołuje inny proces i zwraca jego wartość końcową do bieżącego procesu. Użycie backticks wywołuje inny proces i zwraca wyjście tego procesu do bieżącego procesu.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-09 11:14:31