Kiedy używać każdej metody uruchamiania podprocesu w Ruby

1. `` The Backtick

  • zdefiniowane w jądrze

1. a) %x{} procent X

2. system()

3. fork()

4. open()

4.a. IO.popen() open()

4.b. open("|-")

  • widelec do rury

4.c. IO.popen("-") open("|-")

5. Open3.popen3()

6. PTY.spawn()

  • require 'pty'
  • stdlib PTY

7. Shell.transact()

  • require 'shell'
  • stdlib Shell

Kiedy należy porzucić zaufany back-tick dla jednej z bardziej złożonych metod?

Edycja 1. Wielkie podziękowania dla Avdi Grimm za jego posty opisujące przykładowe wykorzystanie każdej metody: #1 (& gist); #2 (& gist); #3.

Są fantastycznymi zasobami, aby odpowiedzieć Jak, ale nie są wyraźnie skomponowane, aby odpowiedzieć kiedy każdy powinien być użyty lub dlaczego, i jako takie IMHO nie są kompletnymi odpowiedziami na to pytanie.

Author: Community, 2011-08-27

3 answers

  1. Użyj backticks, gdy chcesz łatwo przechwycić wyjście programu w zmiennej. prawdopodobnie chcesz używać tego tylko do krótkich programów, ponieważ to zablokuje.

  2. system jest wygodny w dwóch różnych przypadkach:

    A. Masz długo działający program i chcesz, aby wyjście było drukowane podczas jego działania (np. system("tar zxvf some_big_tarball.tar.gz"))

    B. system może ominąć rozszerzenie powłoki jak exec (porównaj wyjście system "echo *" i system "echo", "*")

    System blokuje do momentu zakończenia podprocesu.

  3. fork ma również kilka różnych przypadków użycia:

    A. chcesz uruchomić jakiś kod ruby w osobnym procesie (np. fork { .... }

    B. chcesz uruchomić proces potomny (lub inny program) bez blokowania postępu skryptu fork { exec "bash" }.

    fork jest twoim przyjacielem, jeśli chcesz demonizować swój program.

  4. IO.popen jest przydatny, gdy trzeba współdziałać ze standardem out i standardem w program. Zauważ, że nie rejestruje standardowego błędu, więc musisz przekierować go za pomocą 2>&1, jeśli ci na tym zależy.

  5. popen3 daje oddzielny deskryptor pliku dla błędu standardowego (gdy musisz przechwycić go oddzielnie od standardowego out)

  6. PTY.spawn jest konieczne, gdy chcemy, aby wywołany program zachowywał się tak, jakbyś uruchamiał go z terminala. Zobacz różnicę grep --color=auto pat file po wywołaniu system vs PTY.spawn

 40
Author: cam,
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
2011-08-31 21:19:55

Oto schemat blokowy oparty na tej odpowiedzi . Zobacz także, używanie script do emulowania terminala.

Tutaj wpisz opis obrazka

 23
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 12:26:07
 8
Author: Michael Kohl,
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
2011-08-27 08:04:40