zoukankan      html  css  js  c++  java
  • Perl调用外部命令的方式和区别

    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中,可以用systemexecreadpipe这三个命令来调用其他脚本、系统命令等。这三个命令的主要区别就是返回值。

    1) 对于system这个函数来说,它会返回执行后的状态,比如说

    @args = (“command”, “arg1″, “arg2″);
    system(@args) == 0
    or die “system @args failed: $?”

    当然,你也可以用类似于下面的语句来检查出错的原因:

    if ($? == -1) {
    print “failed to execute: $!\n”;
    }
    elsif ($? & 127) {
    printf “child died with signal %d, %s coredump\n”,
    ($? & 127),  ($? & 128) ? ‘with’ : ‘without’;
    }
    else {
    printf “child exited with value %d\n”, $? >> 8;
    }

    2) 而对于exec这个函数来说,仅仅是执行一个系统的命令,一般情况下并没有返回值。exec只有在系统没有你要执行的命令的情况下,才会返回false值。

    exec (‘foo’)   or print STDERR “couldn’t exec foo: $!”;
    { exec (‘foo’) }; print STDERR “couldn’t exec foo: $!”;

    3) 当我们需要保存系统命令运行的结果,以便分析并作进一步的处理时,就要用到readpipe这个函数了。例如:

    @result = readpipe( “ls -l /tmp” );
    print “@result”;

    会产生如下的结果:

    drwxr-xr-x  2 root   root    4096 Mar 19 11:55 testdir

    当然,你也可以把生成的结果放到一个文件里,以便写工作日志呀、发布报告呀。

    $inject_command = “./ConfigChecker.bat F:/nic/3502/ARRAY-4AD2E0573/etc “.$device_name;
    chdir “F:/TestTools/bin/”;
    @temp_result = readpipe($inject_command);
    open(result_file,”>result.txt”);
    print result_file @temp_result;
    close(result_file);

    这样,你就把系统运行的结果扔到了系统命令所在目录下的result.txt文件里了。

    完!


    作者:iTech
    微信公众号: cicdops
    出处:http://itech.cnblogs.com/
    github:https://github.com/cicdops/cicdops

  • 相关阅读:
    [51nod1384]全排列
    [51nod1256]乘法逆元
    [51nod1106]质数检测
    [51nod1058]求N!的长度
    2017 world final
    [Manacher+bit]Palindrome
    [hdu3068]最长回文(Manacher算法)
    [trie]字典树模板
    [凸包]Triangles
    LintCode-366.斐波纳契数
  • 原文地址:https://www.cnblogs.com/itech/p/1887836.html
Copyright © 2011-2022 走看看