Perl的反引号,系统和exec有什么区别?
有人可以帮帮我吗? 在Perl中,有什么区别:
exec "command";
和
system("command");
和
print `command`;
还有其他的方法来运行shell命令吗?
EXEC
执行一个命令, 永远不会返回 。 这就像一个函数中的return
语句。
如果该命令没有find,则exec
返回false。 它永远不会返回true,因为如果find该命令,它永远不会返回。 在返回命令的STDOUT
, STDERR
或退出状态方面也没有意义。 你可以在perlfunc
find关于它的文档,因为它是一个函数。
系统
执行一个命令,并在命令完成后继续执行Perl脚本。
返回值是该命令的退出状态。 你可以在perlfunc
find关于它的文档。
反引号
像system
执行一个命令,你的perl脚本在命令完成后继续。
与system
相反,返回值是命令的STDOUT
。 qx//
相当于反引号。 你可以在perlop
find关于它的perlop
,因为不像system
和exec
它是一个操作符。
其他方法
上面所缺less的是一种asynchronous执行命令的方法。 这意味着你的Perl脚本和你的命令同时运行。 这可以通过open
来完成。 它允许你读取STDOUT
/ STDERR
并写入你的命令的STDIN
。 这是平台依赖。
还有几个模块可以缓解这个任务。 有IPC::Open2
和IPC::Open3
和IPC::Run
,以及如果您在Windows上的Win32::Process::Create
。
一般来说,我使用system
, open
, IPC::Open2
,或IPC::Open3
取决于我想做什么。 qx//
运算符虽然很简单,但它的function过于局限,在快速入侵之外非常有用。 我觉得open
得多。
system
:运行一个命令并等待它返回
当你想运行一个命令时,使用system
,不要关心它的输出,并且不要让Perl脚本在命令完成之前做任何事情。
#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 (eg *.txt) for you or you want to redirect #output system("command arg1 arg2 arg3");
qx//
或“ :运行一个命令并捕获它的STDOUT
当你想运行一个命令时,使用qx//
捕获它写入STDOUT的内容,并且不要让Perl脚本在命令完成之前做任何事情。
#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
:用另一个进程replace当前进程。
当你想运行一个命令时,使用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创build一个pipe道
当您想要将数据写入进程的STDIN或从进程的STDOUT读取数据(而不是同时)时使用open
。
#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创build一个pipe道
当需要读取和写入进程的STDIN和STDOUT时,使用IPC::Open2
。
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 :运行一个进程并创build一个pipe道到STDIN,STDOUT和STDERR
当需要捕获进程的所有三个标准文件句柄时,使用IPC::Open3
。 我会写一个例子,但它的工作方式大多与IPC :: Open2一样,但与参数和第三个文件句柄的顺序略有不同。
我先引用手册:
perldoc exec() :
exec函数执行一个系统命令, 永远不会返回 – 如果你希望返回的话,可以使用system而不是exec
perldoc系统() :
与exec LIST完全相同,只是首先完成一个分支 ,并且父进程等待subprocess完成。
与exec和system相反,反引号不会给你返回值,而是收集到的STDOUT。
perldoc`String` :
(可能)插入的string,然后作为带有/ bin / sh或其等价物的系统命令执行。 shell通配符,pipe道和redirect将被授予。 收集的命令的标准输出被返回 ; 标准错误不受影响。
备择scheme:
在更复杂的场景中,如果要获取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
语句是一个function的脚本。
如果找不到命令,则exec
返回false。 它永远不会返回true,因为如果find命令,它永远不会返回。 在返回命令的STDOUT
, STDERR
或退出状态方面也没有意义。 你可以在perlfunc中find关于它的文档,因为它是一个函数。
例如:
#!/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
离开脚本,只有第一个打印语句被执行。 而且, exec
命令输出没有被分配给任何variables。
在这里,只有你得到第一个print
语句的输出和在标准输出上执行ls
命令。
system
system
执行一个命令,并在命令完成后恢复你的Perl脚本。 返回值是该命令的退出状态。 你可以在perlfunc中find关于它的文档。
例如:
#!/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
命令后恢复时,所有三个打印语句都被执行。
此外,运行system
的结果被分配给data2
,但分配的值是0
(来自ls
的退出码)。
在这里,您将获得第一个print
语句的输出,然后是ls
命令的输出,然后是标准输出的最后两个print
语句的输出。
反引号( `
)
和system
一样,用反引号括起一个命令就会执行这个命令,并且在命令完成之后,你的Perl脚本就会恢复。 与system
相反,返回值是命令的STDOUT
。 qx//
相当于反引号。 你可以在perlop中find关于它的文档 ,因为不像system和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
的输出不会直接标准化,而是分配给variablesdata2
,然后由最终的打印语句打印出来。
'exec'和'system'的区别在于exec用'command'replace你当前的程序,永远不会返回你的程序。 系统在另一方面分叉并运行“命令”,并在运行完成时返回“命令”的退出状态。 后退标记运行“命令”,然后返回一个表示其标准的string(不pipe它将打印到屏幕上)
您也可以使用popen来运行shell命令,我认为有一个shell模块 – '使用shell',可以让您透明地访问典型的shell命令。
希望能为你澄清一下。