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、execreadpipe這三個命令來調用其他腳本、系統命令等。這三個命令的主要區別就是返回值。

          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 閱讀(425) 評論(0)  編輯  收藏 所屬分類: Linux

          主站蜘蛛池模板: 宝兴县| 抚顺县| 安国市| 邳州市| 扬中市| 达拉特旗| 盐边县| 沛县| 仁化县| 北宁市| 泰顺县| 方城县| 都安| 沈阳市| 德州市| 龙海市| 临澧县| 阆中市| 华蓥市| 湘乡市| 铜山县| 山东省| 肇源县| 阿克陶县| 阜康市| 泾川县| 瑞昌市| 阿瓦提县| 千阳县| 化州市| 宁武县| 三门峡市| 东至县| 昭觉县| 页游| 诸城市| 新邵县| 安岳县| 拉萨市| 基隆市| 克拉玛依市|