누군가 제발 도와주세요? Perl에서 차이점은 무엇입니까?
exec "command";
과
system("command");
과
print `command`;
쉘 명령을 실행하는 다른 방법이 있습니까?
답변
exec
명령을 실행하고 결코 반환하지 않습니다 . return
함수 의 문장 과 같습니다 .
명령을 찾을 수 없으면 exec
false를 반환합니다. 명령이 발견되면 전혀 리턴하지 않으므로 true를 리턴하지 않습니다. 반환에 대한 아무 문제도 없다 STDOUT
, STDERR
또는 명령의 종료 상태. perlfunc
함수이기 때문에 에 대한 설명서를 찾을 수 있습니다 .
체계
명령을 실행하고 명령이 완료된 후 Perl 스크립트가 계속됩니다.
리턴 값은 명령의 종료 상태입니다. 에 대한 설명서는에서 찾을 수 있습니다 perlfunc
.
백틱
like system
는 명령을 실행하고 명령이 완료된 후 perl 스크립트가 계속됩니다.
system
반환 값 과 달리 STDOUT
명령입니다.
qx//
백틱과 같습니다. 연산자 와 perlop
다르기 때문에 에 대한 설명서를 찾을 수 있습니다 .system
exec
다른 방법들
위에서 빠진 것은 명령을 비동기 적으로 실행하는 방법입니다. 이는 perl 스크립트와 명령이 동시에 실행됨을 의미합니다. 이 작업을 수행하면 open
됩니다. 그것은 당신이 읽을 수 STDOUT
/ STDERR
및 쓰기에 대한 STDIN
명령의. 그래도 플랫폼에 따라 다릅니다.
이 작업을 쉽게 수행 할 수있는 몇 가지 모듈도 있습니다. 이 IPC::Open2
과 IPC::Open3
하고 IPC::Run
뿐만 아니라,
Win32::Process::Create
당신이 창에있는 경우.
답변
일반적으로 내가 사용에서 system
, open
, IPC::Open2
, 또는 IPC::Open3
내가 원하는 무엇에 따라 달라집니다. qx//
운영자는 간단하지만, 너무 빠른 해킹의 매우 유용한 외부로 그 기능에 제약되어있다. 내가 찾을 수 open
많은보다 간편한합니다.
system
: 명령을 실행하고 명령이 리턴 될 때까지 기다립니다.
사용은 system
당신이 명령을 실행 할 때, 출력에 대한 상관 없어, 그리고 펄 스크립트 명령이 완료 될 때까지 아무것도하고 싶지 않아요.
#doesn't spawn a shell, arguments are passed as they are
system("command", "arg1", "arg2", "arg3");
또는
#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//
또는“ : 명령을 실행하고 STDOUT을 캡처하십시오.
사용 qx//
당신이 STDOUT에 기록 무엇을 캡처 명령을 실행하려면, 그리고 펄 스크립트 명령이 완료 될 때까지 아무것도하고 싶지 않아요.
#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
: 현재 프로세스를 다른 프로세스로 바꿉니다.
명령을 실행하고 출력에 신경 쓰지 말고 명령이 돌아 오기를 기다리지 않을 때 exec
함께 사용하십시오 fork
. system
정말 그냥
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
및 perlipc
설명서를.
open
: 프로세스를 실행하고 STDIN 또는 STDERR에 파이프를 작성하십시오.
open
프로세스의 STDIN에 데이터를 쓰거나 프로세스의 STDOUT에서 데이터를 읽으려고 할 때 사용하십시오 (동시에 둘다는 아님).
#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 : 프로세스를 실행하고 STDIN 및 STDOUT에 대한 파이프를 작성하십시오.
IPC::Open2
프로세스의 STDIN 및 STDOUT에서 읽고 쓸 필요가있을 때 사용하십시오 .
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>;
IPC :: Open3 : 프로세스를 실행하고 STDIN, STDOUT 및 STDERR에 파이프를 작성하십시오.
IPC::Open3
프로세스의 세 가지 표준 파일 핸들을 모두 캡처해야 할 때 사용 하십시오. 예제를 작성하지만 IPC :: Open2와 거의 같은 방식으로 작동하지만 인수와 세 번째 파일 핸들의 순서가 약간 다릅니다.
답변
먼저 매뉴얼을 인용하겠습니다.
간부 인 함수는 시스템 명령을 실행하고 반환하지 않습니다 – 사용 시스템을 대신 간부 당신이 반환을 원하는 경우
포크가 먼저 수행 되고 상위 프로세스가 하위 프로세스가 완료 될 때까지 대기 한다는 점을 제외하고는 exec LIST와 정확히 동일한 작업을 수행 합니다.
exec 및 system 과 달리 백틱은 반환 값을 제공하지 않고 수집 된 STDOUT을 제공합니다.
보간 된 후 / bin / sh 또는 이와 동등한 시스템 명령으로 실행되는 문자열입니다 . 쉘 와일드 카드, 파이프 및 리디렉션이 적용됩니다. 명령 의 수집 된 표준 출력이 리턴됩니다 . 표준 오류는 영향을받지 않습니다.
대안 :
STDOUT, STDERR 또는 리턴 코드를 페치하려는보다 복잡한 시나리오에서는 IPC :: Open2 및 IPC :: Open3 과 같은 잘 알려진 표준 모듈을 사용할 수 있습니다 .
예:
use IPC::Open2;
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'some', 'cmd', 'and', 'args');
waitpid( $pid, 0 );
my $child_exit_status = $? >> 8;
마지막으로 CPAN에서 실행 되는 IPC :: Run 도 살펴볼 가치가 있습니다.
답변
Perl의 백틱 ( `
) system
,과 차이점은 무엇입니까 exec
?
exec -> exec "command"; ,
system -> system("command"); and
backticks -> print `command`;
exec
exec
명령을 실행하고 Perl 스크립트를 다시 시작하지 않습니다. 그것은 return
문장 과 같은 스크립트 입니다.
명령을 찾을 수 없으면 exec
false를 반환합니다. 명령이 발견되면 전혀 리턴하지 않으므로 true를 리턴하지 않습니다. 반환에 대한 아무 문제도 없다 STDOUT
, STDERR
또는 명령의 종료 상태. perlfunc 에서 함수에 대한 문서를 찾을 수 있습니다 .
예 :
#!/usr/bin/perl
print "Need to start exec command";
my $data2 = exec('ls');
print "Now END exec command";
print "Hello $data2\n\n";
위의 코드에는 세 개의 print
명령문이 있지만 exec
스크립트 를 종료하면 첫 번째 print 명령문 만 실행됩니다. 또한 exec
명령 출력이 변수에 지정되지 않습니다.
여기에서는 첫 번째 print
명령문 의 출력 만 가져오고 ls
표준 출력 에서 명령을 실행합니다 .
system
system
명령을 실행하고 명령이 완료된 후 Perl 스크립트가 재개됩니다. 리턴 값은 명령의 종료 상태입니다. perlfunc 에서 이에 대한 문서를 찾을 수 있습니다 .
예 :
#!/usr/bin/perl
print "Need to start system command";
my $data2 = system('ls');
print "Now END system command";
print "Hello $data2\n\n";
위의 코드에는 세 가지 print
진술이 있습니다. system
명령 후에 스크립트가 재개 되면 세 개의 print 문이 모두 실행됩니다.
또한 실행 결과 system
는에 할당 data2
되지만 할당 된 값은 0
(종료 코드 ls
)입니다.
여기에서 첫 번째 print
명령문 의 출력을 얻은 다음 ls
명령의 출력을 얻은 다음 print
표준 출력의 마지막 두 명령문 의 출력을 얻 습니다.
백틱 ( `
)
마찬가지로 system
백틱으로 명령을 묶으면 해당 명령이 실행되고 명령이 완료된 후 Perl 스크립트가 다시 시작됩니다. 반대로 system
, 반환 값은 STDOUT
명령의 값입니다 . qx//
백틱과 같습니다. 시스템과는 달리 운영자 이기 때문에 perlop 에서 이에 대한 문서를 찾을 수 있습니다 exec
.
예 :
#!/usr/bin/perl
print "Need to start backticks command";
my $data2 = `ls`;
print "Now END system command";
print "Hello $data2\n\n";
위의 코드에는 세 개의 print
문 이 있으며 세 개 모두 실행되고 있습니다. 의 출력은 ls
직접 표준 출력 되지 않고 변수에 할당 된 data2
다음 최종 인쇄 명령문으로 인쇄됩니다.
답변
‘exec’와 ‘system’의 차이점은 exec가 현재 프로그램을 ‘command’로 바꾸고 프로그램으로 돌아 가지 않는다는 것입니다. 반면에 시스템은 ‘command’를 포크하고 실행하며 실행이 완료되면 ‘command’의 종료 상태를 반환합니다. 백 틱은 ‘command’를 실행 한 다음 표준 출력을 나타내는 문자열을 반환합니다 (화면에 인쇄 된 내용).
popen을 사용하여 쉘 명령을 실행할 수도 있으며 일반적인 쉘 명령에 투명하게 액세스 할 수있는 쉘 모듈 인 ‘셸 사용’이 있다고 생각합니다.
그것이 당신을 위해 그것을 명확히 바랍니다.