2012-02-28 22 views
0

我有一個非常奇怪的錯誤。Linux命令(cp,rm)不會在perl腳本中執行。有些作品。但沒有錯誤返回

我運行一個執行linux命令的perl腳本。它們是這樣執行的:

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1`; 
myLog("$err"); 

而$ err是空的,這表示命令沒有返回並且錯誤。 (對吧?)

我試圖用exec「」或system()來執行linux命令,但沒有成功。 我試圖改變路徑。相同。

此外,我試圖在一個新的perl腳本中只運行cp命令。有用。 但不是在我的完整的Perl腳本。

在這個Perl腳本中,有些命令正在工作,有些則不行。

劇本昨天工作,今天早上不再。在此期間未做任何更改。

我嘗試了很多東西,如果有人有想法,我會很高興。

編輯: 服務器有很多進程未終止。清理那些解決了問題。 所以這個問題與另一個應用程序有關,但是由於您的意見,我會改進日誌記錄。

+3

您缺少錯誤報告。在腳本的頂部添加'use autodie qw(:all);',當出現錯誤時它會用有用的錯誤消息中止。 – daxim 2012-02-28 10:58:45

+1

要非常小心您用於$ HTML或$ subpath或$ HTMLDIR1變量的輸入 - 如果它們中的任何一個允許通過[shell元字符](http://cwe.mitre.org/data /definitions/78.html),你寫了一個不安全的工具。最好使用['File :: Copy :: Recursive'](http://search.cpan.org/~dmuey/File-Copy-Recursive-0.38/Recursive.pm)或類似的工具來避免使用shell完全。 – sarnold 2012-02-28 11:04:53

回答

5

小問題:你是不是捕捉STDERR,所以你不會看到錯誤(你也沒有檢查$?返回代碼)。

你應該做

my $err = `cp -r $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 

到STDERR重定向到STDOUT,或使用一個模塊運行命令。


大問題:

你不應該運行在Perl針對Perl的本機模塊存在系統命令。在這種情況下:File::Copy::Recursive模塊。

您還可以從File::Copy複製roll your own目錄。

1

你在使用反引號嗎?將-v添加到cp命令中以查看STDOUT中的某些內容,並將STDERR重定向到STDOUT,並檢查命令出口代碼,而不是STDERR中的錯誤消息。

怎麼樣執行後立即打印出命令的輸出?

my $err = `cp -rv $HTML /tssobe/www/tstweb/$subpath/$HTMLDIR1 2>&1`; 
my $exitcode = $? >> 8; 
warn "Output: $err\nexitcode: $exitcode\n"; 

這會更好地使用qx。檢查:http://www.perlmonks.org/?node_id=454715

+0

爲什麼你認爲qx //會更好? – 2012-03-22 17:37:47

0

您可能還需要引用可能潛在地包含任何shell特殊字符,包括空格的參數。殼牌將做給它的字符串分詞,如果$HTML包含空格cp會得到更多的參數比你期望的那樣。Perl對此有着非常簡單的機制:\Q\E。這裏是你如何做到這一點:

my $err = `cp -r \Q$HTML\E \Q/tssobe/www/tstweb/$subpath/$HTMLDIR1\E 2>&1`; 

任何東西,除了字母數字將它傳遞給前殼反斜線轉義。不管這些變量是什麼,你都會提供2個參數給cp

相關問題