Czy ktoś może mi pomóc? W Perlu jaka jest różnica między:
exec "command";
i
system("command");
i
print `command`;
Czy są też inne sposoby uruchamiania poleceń powłoki?
Czy ktoś może mi pomóc? W Perlu jaka jest różnica między:
exec "command";
i
system("command");
i
print `command`;
Czy są też inne sposoby uruchamiania poleceń powłoki?
Odpowiedzi:
wykonuje polecenie i nigdy nie wraca . To jest jak return
instrukcja w funkcji.
Jeśli polecenie nie zostanie znalezione, exec
zwraca false. Nigdy nie zwraca prawdy, ponieważ jeśli polecenie zostanie znalezione, nigdy nie zwraca. Nie ma też sensu w powrocie STDOUT
, STDERR
lub stanu wyjścia polecenia. Możesz znaleźć dokumentację na ten temat perlfunc
, ponieważ jest to funkcja.
wykonuje polecenie, a skrypt Perla jest kontynuowany po zakończeniu polecenia.
Wartość zwracana to status wyjścia polecenia. Dokumentację na ten temat można znaleźć w perlfunc
.
jak system
wykonuje polecenie, a skrypt perla jest kontynuowany po zakończeniu polecenia.
W przeciwieństwie do system
wartości zwracanej STDOUT
polecenia.
qx//
jest równoważne z backticks. Możesz znaleźć dokumentację na ten temat perlop
, ponieważ w przeciwieństwie do system
i exec
jest to operator.
Brakuje w powyższym sposobie wykonywania polecenia asynchronicznie. Oznacza to, że twój skrypt perla i twoje polecenie działają jednocześnie. Można to osiągnąć za pomocą open
. Pozwala na odczyt STDOUT
/ STDERR
zapis STDIN
twojego polecenia. Jest to jednak zależne od platformy.
Istnieje również kilka modułów, które mogą ułatwić to zadanie. Jest IPC::Open2
i IPC::Open3
a IPC::Run
, a także
Win32::Process::Create
, jeśli są na oknach.
W powszechnym użyciu I system
, open
, IPC::Open2
, lub IPC::Open3
w zależności od tego, co chcę robić. qx//
Operator, natomiast proste, jest zbyt ograniczające jego funkcjonalność jest bardzo przydatna poza szybkimi hacki. Uważam, że open
jest dużo bardziej poręczny.
system
: uruchom polecenie i poczekaj na jego powrótUżyj, system
gdy chcesz uruchomić polecenie, nie przejmuj się jego wynikiem i nie chcesz, aby skrypt Perla zrobił cokolwiek, dopóki polecenie się nie zakończy.
#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");
lub
#spawns a shell, arguments are interpreted by the shell, use only if you
#want the shell to do globbing (e.g. *.txt) for you or you want to redirect
#output
system("command arg1 arg2 arg3");
qx//
lub `` : uruchom polecenie i przechwyć jego STDOUTUżyj, qx//
gdy chcesz uruchomić polecenie, przechwyć to, co zapisuje do STDOUT, i nie chcesz, aby skrypt Perla zrobił cokolwiek, dopóki polecenie się nie skończy.
#arguments are always processed by the shell
#in list context it returns the output as a list of lines
my @lines = qx/command arg1 arg2 arg3/;
#in scalar context it returns the output as one string
my $output = qx/command arg1 arg2 arg3/;
exec
: zastąp bieżący proces innym.Użyj exec
wraz z, fork
gdy chcesz uruchomić polecenie, nie dbaj o jego wynik i nie chcesz czekać na jego powrót. system
jest naprawdę sprawiedliwy
sub my_system {
die "could not fork\n" unless defined(my $pid = fork);
return waitpid $pid, 0 if $pid; #parent waits for child
exec @_; #replace child with new process
}
Możesz także przeczytać instrukcje waitpid
i perlipc
instrukcje.
open
: uruchom proces i utwórz potok do jego STDIN lub STDERRUżyj, open
gdy chcesz zapisać dane do STDIN procesu lub odczytać dane z STDOUT procesu (ale nie oba jednocześnie).
#read from a gzip file as if it were a normal file
open my $read_fh, "-|", "gzip", "-d", $filename
or die "could not open $filename: $!";
#write to a gzip compressed file as if were a normal file
open my $write_fh, "|-", "gzip", $filename
or die "could not open $filename: $!";
Użyj, IPC::Open2
gdy musisz czytać i zapisywać do STDIN i STDOUT procesu.
use IPC::Open2;
open2 my $out, my $in, "/usr/bin/bc"
or die "could not run bc";
print $in "5+6\n";
my $answer = <$out>;
używaj, IPC::Open3
gdy chcesz przechwycić wszystkie trzy standardowe uchwyty plików procesu. Chciałbym napisać przykład, ale działa głównie tak samo jak IPC :: Open2, ale z nieco inną kolejnością niż argumenty i uchwytem trzeciego pliku.
Funkcja exec wykonuje polecenie systemowe i nigdy nie powraca - użyj systemu zamiast exec, jeśli chcesz, aby zwrócił
Robi dokładnie to samo co exec LIST, z tą różnicą, że najpierw wykonuje się rozwidlenie , a proces nadrzędny czeka na zakończenie procesu potomnego.
W przeciwieństwie do exec i system , backsticks nie dają wartości zwracanej, ale zebrane STDOUT.
Ciąg, który jest (ewentualnie) interpolowany, a następnie wykonywany jako polecenie systemowe za pomocą / bin / sh lub jego odpowiednika. Symbole wieloznaczne powłoki, potoki i przekierowania będą honorowane. Zwrócono zebrane standardowe dane wyjściowe polecenia ; standardowy błąd pozostaje niezmieniony.
W bardziej złożonych scenariuszach, w których chcesz pobrać STDOUT, STDERR lub kod powrotu, możesz użyć dobrze znanych standardowych modułów, takich jak IPC :: Open2 i IPC :: Open3 .
Przykład:
use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
Na koniec warto również spojrzeć na IPC :: Run z CPAN…
Jaka jest różnica między backlickami Perla ( `
) system
i exec
?
exec -> exec "command"; ,
system -> system("command"); and
backticks -> print `command`;
exec
exec
wykonuje polecenie i nigdy nie wznawia skryptu Perl. To jest do skryptu, podobnie jak return
instrukcja do funkcji.
Jeśli polecenie nie zostanie znalezione, exec
zwraca false. Nigdy nie zwraca wartości true, ponieważ jeśli polecenie zostanie znalezione, nigdy się nie zwraca. Nie ma też sensu w powrocie STDOUT
, STDERR
lub stanu wyjścia polecenia. Dokumentację na ten temat można znaleźć w Perlfunc , ponieważ jest to funkcja.
Na przykład:
#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";
W powyższym kodzie znajdują się trzy print
instrukcje, ale z powodu exec
opuszczenia skryptu wykonywana jest tylko pierwsza instrukcja print. Ponadto dane exec
wyjściowe polecenia nie są przypisywane do żadnej zmiennej.
Tutaj tylko ty otrzymujesz wynik pierwszej print
instrukcji i wykonanials
polecenia na standardowym wyjściu.
system
system
wykonuje polecenie, a skrypt Perla jest wznawiany po zakończeniu polecenia. Wartość zwracana to status wyjścia polecenia. Dokumentację na ten temat można znaleźć w Perlfunc .
Na przykład:
#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";
W powyższym kodzie są trzy print
instrukcje. Ponieważ skrypt jest wznawiany po system
komendzie, wykonywane są wszystkie trzy instrukcje drukowania.
Ponadto wynik działania system
jest przypisany do data2
, ale przypisana wartość to0
(kod wyjścia z ls
).
Tutaj otrzymujesz wynik pierwszej print
instrukcji, a następnie wynikuls
polecenia, a następnie wyniki dwóch ostatnichprint
instrukcji na wyjściu standardowym.
`
)Podobnie system
, umieszczenie polecenia w backticks powoduje wykonanie polecenia, a skrypt Perla jest wznawiany po zakończeniu polecenia. W przeciwieństwie do system
wartości zwracanej jest STDOUT
polecenie. qx//
jest równoważne z backticks. Możesz znaleźć dokumentację na ten temat w Perlop , ponieważ w przeciwieństwie do systemu i exec
jest to operator.
Na przykład:
#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";
W powyższym kodzie znajdują się trzy print
instrukcje i wszystkie trzy są wykonywane. Dane wyjściowe ls
nie wyjdą bezpośrednio poza standard, ale zostaną przypisane do zmiennej, data2
a następnie wydrukowane przez końcową instrukcję print.
Różnica między „exec” i „system” polega na tym, że exec zastępuje bieżący program „komendą” i NIGDY nie wraca do programu. system, z drugiej strony, rozwidla i uruchamia „polecenie” i zwraca status wyjścia „polecenia”, gdy jest on uruchomiony. Zaznaczenie tylne uruchamia „polecenie”, a następnie zwraca ciąg reprezentujący jego standardowe wyjście (cokolwiek by wydrukowało na ekranie)
Możesz także używać popen do uruchamiania poleceń powłoki i myślę, że istnieje moduł powłoki - „użyj powłoki”, który daje przejrzysty dostęp do typowych poleceń powłoki.
Mam nadzieję, że to ci wyjaśni.
use Shell;
( search.cpan.org/dist/Shell/Shell.pm )? Nie jest powszechnie instalowany, ani nie ma zastosowania do pytania, tak myślę ...