2012-04-21 140 views
0

我有下面的代碼片段,我跑作爲日常幾項工作的一部分:系統命令VS Perl的子程序

system("cp $keyFile $destinationFile"); 
    system("chown $userID $destinationFile"); 
    system("chmod 400 $destinationFile"); 

與上面的代碼的問題是,有時,很少,至少的一個上述操作未成功完成,我的工作失敗。如果上述操作之一失敗,但作業失敗仍然可行,但我仍想避免簡單系統命令中失敗的一個。

所以我有以下選擇:

  1. 使用Perl子程序File::Copy::copychmodchown而不是系統命令。
  2. 檢查system()命令的返回值。這我已經做了,但並沒有解釋爲什麼它可能會失敗。

是更好/更安全的使用Perl子程序,而不是系統命令。我的工作將總是運行在RHEL5機器[從來沒有Windows]。

還有什麼我可以在這裏做的。我怎樣才能收集有關錯誤的更多信息?

更新:文件名或文件路徑將永遠不會包含空格或怪異字符。他們將從集[a-zA-Z]。

+1

我想你的文件名,絕不會包含可能會改變CP,CHOWN或搭配chmod命令的含義空格或其他奇怪的字符? – mttrb 2012-04-21 06:30:38

+0

@mttrb ...從來沒有。 – 2012-04-21 06:31:23

+0

您可以使用open3捕獲stdout和stderr:http://perldoc.perl.org/IPC/Open3.html。在這裏閱讀faq:http://perldoc.perl.org/perlfaq8.html#How-can-I-capture-STDERR-from-an-external-command%3f – Unos 2012-04-21 07:50:35

回答

4

是的,最好使用Perl本地版本(File::Copychmod())。

其中的原因有很多:

  • 性能。調用system()分叉1和2個新進程(一個用於命令,另一個用於shell),這是一個繁重的操作

  • 錯誤檢查。在Perl IO相關的系統調用設置"$!"錯誤文本變量時錯誤發生:

    File::Copy::copy($source, $destination) 
        || die "Failed to copy from $source to $destination. Error: $!\n"; 
    
+0

+1。另一個普遍的原因是可移植性,但這在OP的情況下並不特別重要,因爲它對於他來說總是RHE5。 – Gowtham 2012-04-21 07:00:44

+0

雖然我同意不是我首要關注的表現觀點。我能做些什麼額外的調試來了解爲什麼有時候這些操作可能會失敗。 – 2012-04-21 07:17:32

+0

@SwarangaSarma - 參見'$!' – DVK 2012-04-21 07:33:27