Birisi bana yardım edebilir mi? Perl'de, arasındaki fark nedir:
exec "command";
ve
system("command");
ve
print `command`;
Kabuk komutlarını çalıştırmanın başka yolları da var mı?
Birisi bana yardım edebilir mi? Perl'de, arasındaki fark nedir:
exec "command";
ve
system("command");
ve
print `command`;
Kabuk komutlarını çalıştırmanın başka yolları da var mı?
Yanıtlar:
bir komutu yürütür ve asla geri dönmez . return
Bir fonksiyondaki bir ifade gibidir .
Komut bulunmazsa exec
false değerini döndürür. Asla true döndürmez, çünkü komut bulunursa hiçbir zaman geri dönmez. Dönen hiçbir noktası bulunmaktadır STDOUT
, STDERR
ya da komutun çıkış durumunu. perlfunc
Bir işlev olduğu için bununla ilgili belgeleri bulabilirsiniz .
bir komut yürütür ve Perl betiğiniz komut bittikten sonra devam eder.
Dönüş değeri, komutun çıkış durumudur. Bununla ilgili belgeleri bulabilirsiniz perlfunc
.
gibi system
bir komut yürütür ve perl betiğiniz komut bittikten sonra devam eder.
system
Dönüş değerinin aksine STDOUT
komut vardır.
qx//
ters çentiklere eşdeğerdir. Onunla ilgili belgeleri bulabilirsiniz perlop
, çünkü aksine system
ve exec
bir operatördür.
Yukarıdakilerden eksik olan bir komutu eşzamansız olarak yürütmenin bir yoludur. Yani perl betiğiniz ve komutunuz aynı anda çalışır. Bu ile başarılabilir open
. Komutunuzu okumanıza STDOUT
/ STDERR
yazmanıza izin verir STDIN
. Yine de platforma bağlıdır.
Bu görevleri kolaylaştırabilecek çeşitli modüller de vardır. Orada IPC::Open2
ve IPC::Open3
ve IPC::Run
, hem de
Win32::Process::Create
pencere üzerinde iseniz.
Genel Ben Kullanımda system
, open
, IPC::Open2
veya IPC::Open3
ne yapmak istediğinize bağlı. qx//
Operatör, basit iken, çok hızlı dalaverecileri çok faydalı dışında olma işlevselliği sınırlamakta olduğunu. Çok open
daha kullanışlı buluyorum .
system
: bir komut çalıştırın ve geri dönmesini bekleyinsystem
Bir komutu çalıştırmak istediğinizde kullanın , çıktısını önemsemeyin ve Perl betiğinin komut bitene kadar hiçbir şey yapmasını istemeyin.
#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");
veya
#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//
veya `` : bir komut çalıştırın ve STDOUT'u yakalayınKullanım qx//
bunu STDOUT yazdıkları, yakalama, bir komutu çalıştırmak istiyor ve Perl kod komutu bitene kadar bir şey yapmak istemiyoruz.
#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
: geçerli işlemi başka bir işlemle değiştir.Bir komutu çalıştırmak istediğinizde exec
birlikte kullanın fork
, çıktısını önemsemeyin ve geri dönmesini beklemek istemeyin. system
gerçekten sadece
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
}
waitpid
Ve perlipc
kılavuzlarını da okumak isteyebilirsiniz .
open
: bir işlemi çalıştırın ve STDIN veya STDERR'sine bir boru oluşturunopen
Bir işlemin STDIN'ine veri yazmak veya bir işlemin STDOUT'undan veri okumak istediğinizde kullanın (ancak her ikisini aynı anda değil).
#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: $!";
IPC::Open2
Bir işlemin STDIN ve STDOUT öğelerinden okuma ve yazma gerektiğinde kullanın .
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>;
kullanmak IPC::Open3
Eğer sürecin her üç standart dosya kolları yakalamak için gerektiğinde. Bir örnek yazmak istiyorum, ancak çoğunlukla IPC :: Open2 ile aynı şekilde çalışır, ancak argümanlar ve üçüncü bir dosya tanıtıcısı için biraz farklı bir düzen ile.
Exec fonksiyonu bir sistem komutu yürütür ve asla geri dönmez - eğer geri dönmesini istiyorsanız exec yerine sistemi kullan
İlk olarak bir çatal yapılması ve üst işlemin alt işlemin tamamlanmasını beklemesi dışında, exec LIST ile aynı şeyi yapar .
Exec ve sistemin aksine , backticks size dönüş değerini değil toplanan STDOUT'u verir.
(Muhtemelen) enterpolasyonu yapılan ve daha sonra / bin / sh veya eşdeğeri ile sistem komutu olarak yürütülen bir dize . Kabuk joker karakterleri, boruları ve yönlendirmeleri onurlandırılacaktır. Komutun toplanan standart çıktısı döndürülür ; standart hata bundan etkilenmez.
STDOUT, STDERR veya dönüş kodunu getirmek istediğiniz daha karmaşık senaryolarda IPC :: Open2 ve IPC :: Open3 gibi iyi bilinen standart modülleri kullanabilirsiniz .
Misal:
use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
Perl'in backticks ( `
) system
, ve arasındaki fark nedir exec
?
exec -> exec "command"; ,
system -> system("command"); and
backticks -> print `command`;
exec
exec
bir komut yürütür ve Perl betiğini sürdürmez. Bu bir betik gibi bir return
deyim gibi bir işlevdir.
Komut bulunamazsa exec
false değerini döndürür. Asla true döndürmez, çünkü komut bulunursa hiçbir zaman geri dönmez. Dönen hiçbir noktası bulunmaktadır STDOUT
, STDERR
ya da komutun çıkış durumunu. Onunla ilgili belgeleri perlfunc'ta bulabilirsiniz , çünkü bu bir işlevdir.
Örneğin:
#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";
Yukarıdaki kodda, üç print
ifade vardır, ancak exec
komut dosyasını terk ettiği için yalnızca ilk print deyimi yürütülür. Ayrıca, exec
komut çıkışı herhangi bir değişkene atanmıyor.
Burada, yalnızca ilk print
ifadenin çıktısını alıyorsunuz ve standart çıkışta ls
komutu yürütüyorsunuz .
system
system
bir komut yürütür ve Perl betiğiniz komut bittikten sonra devam eder. Dönüş değeri, komutun çıkış durumudur. Bununla ilgili belgeleri perlfunc'ta bulabilirsiniz .
Örneğin:
#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";
Yukarıdaki kodda üç print
ifade vardır. Komuttan sonra komut dosyası kaldığı yerden devam ettiğinden system
, üç yazdırma ifadesinin tümü yürütülür.
Aynı zamanda, çalışma sonucu system
bir tahsis data2
, ancak atanan değer 0
(çıkış kodu ls
).
Burada, ilk print
ifadenin çıktısını , ardından ls
komutun çıktısını ve ardından print
standart çıkıştaki son iki ifadenin çıktılarını alıyorsunuz .
`
)Mesela system
, bir komutu backticks içine almak o komutu yürütür ve Perl betiğiniz komut bittikten sonra devam eder. Bunun aksine system
, dönüş değeri STDOUT
komuttur. qx//
ters çentiklere eşdeğerdir. Bununla ilgili belgeleri perlop'ta bulabilirsiniz , çünkü sistemin aksine ve exec
bir operatördür.
Örneğin:
#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";
Yukarıdaki kodda, üç print
ifade vardır ve üçü de yürütülmektedir. Çıktısı ls
doğrudan standart dışı olmayacak, ancak değişkene atanacak data2
ve daha sonra son baskı ifadesi ile basılacaktır.
'Exec' ve 'system' arasındaki fark, exec'in mevcut programınızı 'command' ile değiştirmesi ve ASLA programınıza geri dönmesidir. Diğer yandan sistem, 'command' komutunu çatallar ve çalıştırır ve çalıştırıldığında 'command' komutunun çıkış durumunu döndürür. Arka kene 'command' komutunu çalıştırır ve ardından standart çıkışını temsil eden bir dize döndürür (ekrana ne yazdırırsa yazdırsın)
Kabuk komutlarını çalıştırmak için popen'i de kullanabilirsiniz ve bence bir kabuk modülü var - tipik kabuk komutlarına şeffaf erişim sağlayan 'kabuk kullan'.
Umarım bu sizin için açıklığa kavuşur.
use Shell;
( search.cpan.org/dist/Shell/Shell.pm )? Yaygın olarak yüklü değil, ne de soru için geçerli, sanırım ...