Kiedy używać każdej metody uruchamiania podprocesu w Ruby
1. ``
The Backtick
1. a) %x{}
procent X
- zdefiniowane w parse.y, see dyskusja
2. system()
3. fork()
4. open()
-
Otwórz a rura
- Kernel # open
4.a. IO.popen()
open()
- otwórz rurę
- IO # popen
4.b. open("|-")
-
widelec do rury
4.c. IO.popen("-")
open("|-")
- widelec do rury
- zobacz dyskusja
5. Open3.popen3()
require 'open3'
- stdlib Open3
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?
system()
fork()
open()
IO.popen()
open()
open("|-")
IO.popen("-")
open("|-")
Open3.popen3()
require 'open3'
PTY.spawn()
require 'pty'
Shell.transact()
require 'shell'
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.
3 answers
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.
-
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 jakexec
(porównaj wyjściesystem "echo *"
isystem "echo", "*"
)System blokuje do momentu zakończenia podprocesu.
-
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. 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.-
popen3
daje oddzielny deskryptor pliku dla błędu standardowego (gdy musisz przechwycić go oddzielnie od standardowego out) 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łaniusystem
vsPTY.spawn
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.
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
Zobacz ten artykuł z serii:
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