2009-09-04 211 views
7

在Perl中,從我的腳本運行另一個Perl腳本,或運行像mv任意系統命令,cppkgaddpkgrmpkginforpm等,我們可以使用以下命令:Perl中的system,exec和反引號有什麼區別?

  • system()
  • exec()
  • ``(反引號)

是否所有三個一樣,還是他們不同?在所有情況下,所有這三者是否都有相同的結果?它們是否用於不同的場景,比如調用我們必須使用的Perl程序system()以及其他我們必須使用的``(反引號)。

請指教,因爲我目前使用system()進行所有呼叫。

+1

這種處理是http://stackoverflow.com/questions/797127/whats-the-differences-between的副本-system-and-backticks-and-pipes-in-perl – 2009-09-04 08:57:43

+1

這不是重複的,因爲該問題沒有提及'exec()'。 – 2009-09-08 02:30:17

+0

不,但它是http://stackoverflow.com/questions/799968/whats-the-difference-between-perls-backticks-system-and-exec :)的副本:) – 2012-01-31 17:28:37

回答

12

它們全都不同,文檔解釋它們的不同之處。反引號捕獲並返回輸出; system返回退出狀態,如果成功,exec根本不會返回。

3

最好選項是使用某個模塊,無論是在標準庫還是來自CPAN,爲您完成工作。它將變得更加便攜,甚至可能更快速地完成快速任務(不會分叉到系統)。

但是,如果這對你來說不夠好,你可以使用其中的一種,不,它們是不一樣的。請閱讀system()exec()backticks上的perldoc頁面以瞭解其差異。

+0

在perlop中有更多的頁面(section 「類似引用語言的運算符」,小節「qx/STRING /」)以及'perldoc -f readpipe'。 – hobbs 2009-09-04 04:34:42

+0

http://perldoc.perl.org/perlop.html#Quote-Like-Operators我認爲。 – seth 2009-09-04 04:34:47

+0

我找到了。我似乎錯過了一些樹木的森林。或者其他的東西。 – 2009-09-04 04:35:49

1

調用system通常是一個錯誤。例如,而不是說

system "mv $foo /tmp" == 0 
    or die "could not move $foo to /tmp"; 

system "cp $foo /tmp" == 0 
    or die "could not copy $foo to /tmp"; 

你應該說對於處理其他命令你模塊上CPAN

use File::Copy; 

move $foo, "/tmp" 
    or die "could not move $foo to /tmp: $!"; 

copy $foo, "/tmp" 
    or die "could not copy $foo to /tmp: $!"; 

看。如果您發現自己正在編寫大量system的調用,則可能需要重新放回到shell腳本中。

+0

我不會說這通常是一個錯誤,只是你可能能夠在純Perl中完成這項任務。 system()有很多有效的用法。 – 2009-09-04 16:19:41

+1

我不是說調用'system'是一個錯誤,但大多數人稱之爲錯誤。你需要一個很好的理由來調用'system'。 – 2009-09-04 16:33:44

-1

如果您不希望Shell涉及(通常您不需要),並且如果等待系統命令是可以接受的,我推薦使用IPC::Run3。它很簡單,靈活,執行一個程序的常見任務,爲它提供輸入並正確捕獲它的輸出和錯誤流。

6

IPC::System::Simple可能是你想要的。

它提供反引號,系統()和其他IPC命令的安全,便攜替代品。

它還允許您避免大多數上述命令的shell,這在某些情況下可能會有所幫助。

+0

我剛試過這個模塊,它很棒。太棒了! – 2009-10-06 15:29:47

1

那麼,越多的人越多的答案。

我的答案是通常會避免執行外部命令。如果你可以 - 使用模塊。執行「cp」,「mv」和許多其他命令沒有意義 - 存在執行它的模塊。而使用模塊的好處是它們通常都是跨平臺的。而你的系統(「mv」)可能不會。

當放在我沒有其他辦法的情況下,但要打電話給外部命令,我更喜歡使用IPC::Run。這個想法是,所有簡單的方法(反引號,qx,系統,用管道打開)本質上是不安全的,需要關注參數。

隨着IPC::Run,我運行命令像我將與系統(@array),這是更爲安全的做,我可以綁定到標準輸入,輸出和錯誤分開,使用變量,或者回調,這是非常當你需要將數據從長時間運行的代碼傳遞給外部程序時,這很酷。

此外,它內置了超時,這來方便不止一次:)

相關問題