<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Chan Chen Coding...

    Perl調用外部命令的方式和區別

    refer to: http://hi.baidu.com/develop_skill/blog/item/d69bc0cbf010da4ff31fe72b.html
    refer to: http://cn.waterlin.org/

    Perl調用外部命令的方式和區別

    主要的方式簡述如下:
    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);
    使用帶管道的文件句柄來執行外部命令,使用方式與讀寫文件類似??梢詮耐獠棵畹妮敵鲎x取數據,也可以將數據輸出到外部命令作為輸入。

    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函數來執行系統命令

    在Perl中,可以用system、exec、readpipe這三個命令來調用其他腳本、系統命令等。這三個命令的主要區別就是返回值。

    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文件里了。



    -----------------------------------------------------
    Silence, the way to avoid many problems;
    Smile, the way to solve many problems;

    posted on 2012-03-08 09:43 Chan Chen 閱讀(420) 評論(0)  編輯  收藏 所屬分類: Linux

    主站蜘蛛池模板: 无码一区二区三区免费视频 | 久久精品国产亚洲av麻豆小说| 亚洲一级特黄无码片| 亚洲AV无码一区二区一二区| 久久久久久国产a免费观看黄色大片| 国产香蕉九九久久精品免费| 亚洲成人免费电影| 国产卡一卡二卡三免费入口| 亚洲一线产区二线产区区| 亚洲免费黄色网址| 亚洲午夜精品在线| 成人网站免费观看| 含羞草国产亚洲精品岁国产精品| 久草免费福利资源站| 亚洲国产综合精品中文第一区| 亚洲日韩国产二区无码 | 久久精品国产亚洲av麻豆图片| 亚洲另类无码专区首页| 女人18毛片a级毛片免费视频| 亚洲人成影院在线无码按摩店| 亚洲最大无码中文字幕| 永久免费av无码网站大全| 亚洲GV天堂GV无码男同| 亚洲精品乱码久久久久久蜜桃| 亚洲欧洲日韩极速播放| 爽爽日本在线视频免费| a在线视频免费观看在线视频三区| 成年性羞羞视频免费观看无限 | 亚洲xxxxxx| 国产精品成人免费视频网站京东| 国产精品亚洲精品日韩已满| 中文字幕在线免费| 中文日韩亚洲欧美制服| 亚洲国产精品尤物yw在线| 青青草原1769久久免费播放| 亚洲人成网国产最新在线| 久久亚洲AV无码西西人体| 国产精品免费精品自在线观看| 亚洲欧洲日产国产综合网| 很黄很色很刺激的视频免费| 男人扒开添女人下部免费视频|