设为首页 收藏本站
查看: 703|回复: 0

[经验分享] Perl调用外部命令的方式和区别

[复制链接]

尚未签到

发表于 2015-12-26 12:33:49 | 显示全部楼层 |阅读模式
  
  Perl调用外部命令的方式和区别
  转自:http://hi.baidu.com/develop_skill/blog/item/d69bc0cbf010da4ff31fe72b.html

主要的方式简述如下:
1. system("command");
使用该命令将开启一个子进程执行引号中的命令,父进程将等待子进程结束并继续执行下面的代码。
2. exec("command");
效果同system命令类似,区别是不会开启子进程,而是取代父进程,因此执行完引号中的命令后进程即结束。一般和fork配合使用。
3. `command`;
使用反引号调用外部命令能够捕获其标准输出,并按行返回且每行结束处附带一个回车。反引号中的变量在编译时会被内插为其值。
4. open LIST "ls -l|";
    open MORE "|more";
    @list=<LIST>;
    print MORE @list;
    close(LIST);
    close(MORE);
使用带管道的文件句柄来执行外部命令,使用方式与读写文件类似。可以从外部命令的输出读取数据,也可以将数据输出到外部命令作为输入。
5. defined(my $pid=fork) or die "Can not fork: $!\n";
    unless ($pid) {
        exec ("date");
    }
waitpid ($pid,0);
使用fork将会开启子进程与父进程同时执行之后的代码,其中父进程中fork会返回一个非零的数,而子进程中将返回零。上面的代码完成和system("date")相同的功能。比起system单纯地调用外部命令,fork可以完成更加复杂的进程操作。  

  在Perl中用system、exec、readpipe函数来执行系统命令
  转自:http://cn.waterlin.org/
  在Perl中,可以用system、exec、readpipe这三个命令来调用其他脚本、系统命令等。这三个命令的主要区别就是返回值。
  1) 对于system这个函数来说,它会返回执行后的状态,比如说
  @args = (&#8220;command&#8221;, &#8220;arg1&#8243;, &#8220;arg2&#8243;);
system(@args) == 0
or die &#8220;system @args failed: $?&#8221;
  当然,你也可以用类似于下面的语句来检查出错的原因:
  if ($? == -1) {
print &#8220;failed to execute: $!\n&#8221;;
}
elsif ($? & 127) {
printf &#8220;child died with signal %d, %s coredump\n&#8221;,
($? & 127),  ($? & 128) ? &#8216;with&#8217; : &#8216;without&#8217;;
}
else {
printf &#8220;child exited with value %d\n&#8221;, $? >> 8;
}
  2) 而对于exec这个函数来说,仅仅是执行一个系统的命令,一般情况下并没有返回值。exec只有在系统没有你要执行的命令的情况下,才会返回false值。
  exec (&#8216;foo&#8217;)   or print STDERR &#8220;couldn&#8217;t exec foo: $!&#8221;;
{ exec (&#8216;foo&#8217;) }; print STDERR &#8220;couldn&#8217;t exec foo: $!&#8221;;
  3) 当我们需要保存系统命令运行的结果,以便分析并作进一步的处理时,就要用到readpipe这个函数了。例如:
  @result = readpipe( &#8220;ls -l /tmp&#8221; );
print &#8220;@result&#8221;;
  会产生如下的结果:
  drwxr-xr-x  2 root   root    4096 Mar 19 11:55 testdir
  当然,你也可以把生成的结果放到一个文件里,以便写工作日志呀、发布报告呀。
  $inject_command = &#8220;./ConfigChecker.bat F:/nic/3502/ARRAY-4AD2E0573/etc &#8220;.$device_name;
chdir &#8220;F:/TestTools/bin/&#8221;;
@temp_result = readpipe($inject_command);
open(result_file,&#8221;>result.txt&#8221;);
print result_file @temp_result;
close(result_file);
  这样,你就把系统运行的结果扔到了系统命令所在目录下的result.txt文件里了。
  
  完!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156548-1-1.html 上篇帖子: Perl面向对象编程(Object-Oriented Perl)翻译(1) 下篇帖子: How To: Perl TCP / UDP Socket Programming using IO::Socket::INET
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表