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ć.

 330
Author: max, 2011-06-14

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
 359
Author: Konrad Reiche,
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.

Tutaj wpisz opis obrazka

 201
Author: Ian,
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.

 94
Author: William Pursell,
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