Perl調用外部命令(其他腳本、系統命令)的方法和區別


1. `command`;

使用反引號調用外部命令能夠捕獲其標准輸出,並按行返回且每行結束處附帶一個回車。反引號中的變量在編譯時會被內插為其值。
 
2.  open LIST "ls -l|";
    open MORE "|more";
    @list=<LIST>;
    print MORE @list;
    close(LIST);
    close(MORE);
使用帶管道的文件句柄來執行外部命令,使用方式與讀寫文件類似。可以從外部命令的輸出讀取數據,也可以將數據輸出到外部命令作為輸入。
 
3.  system("command");
使用該命令將開啟一個子進程執行引號中的命令,父進程將等待子進程結束並繼續執行下面的代碼。
  eg:system ("mkdir outdir ") unless (-d outdir);   #如果不存在outdir目錄,就調用外部函數mkdir創建outdir目錄
system會返回執行后的狀態,即,如果正確執行完畢,返回0;沒有執行返回非0
  eg: @args = (“mkdir″, “outdir″); system(@args) == 0  or die “system @args failed: $!”   <=>  system("mkdir outdir") == 0 or die "system @args failed: $!"

4.  exec("command");
效果同system命令類似,區別是不會開啟子進程,而是取代父進程,因此執行完引號中的命令后進程即結束。一般和fork配合使用。
而對於 exec這個函數來說,如果執行了exec則結束后續所有進程,包括他自己的返回值<=>沒有返回值; exec在系統沒有你要執行的命令的情況下,不會返回false值,只是報錯!!!和返回數值0 !!!

5.  defined(my $pid=fork) or die "Can not fork: $!\n";
    unless ($pid) {
        exec ("date");
    }
waitpid ($pid,0);
使用fork將會開啟子進程與父進程同時執行之后的代碼,其中父進程中fork會返回一個非零的數,而子進程中將返回零。上面的代碼完成和system("date")相同的功能。比起system單純地調用外部命令,fork可以完成更加復雜的進程操作。

6. @result = readpipe( “ls -l /tmp” );
    print “@result”;
當我們需要保存系統命令運行的結果,以便分析並作進一步的處理時,就要用到 readpipe這個函數了。
會產生如下的結果:

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

 
參考:
 【如有錯誤,望留言指正~】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM