我在我的Bash腳本中調用了許多Perl腳本(有時也來自csh)。如何檢查Perl腳本是否沒有編譯錯誤?
在Bash腳本的開始部分,我想放一個測試,檢查所有的Perl腳本是否沒有任何編譯錯誤。
這樣做的一種方法是實際調用Bash腳本中的Perl腳本和grep
以獲得管道日誌文件中的「編譯錯誤」,但這會變得混亂,因爲在代碼中的不同點上調用不同的Perl腳本,所以我想在Bash腳本的開頭就這樣做。
有沒有辦法檢查Perl腳本是否沒有編譯錯誤?
我在我的Bash腳本中調用了許多Perl腳本(有時也來自csh)。如何檢查Perl腳本是否沒有編譯錯誤?
在Bash腳本的開始部分,我想放一個測試,檢查所有的Perl腳本是否沒有任何編譯錯誤。
這樣做的一種方法是實際調用Bash腳本中的Perl腳本和grep
以獲得管道日誌文件中的「編譯錯誤」,但這會變得混亂,因爲在代碼中的不同點上調用不同的Perl腳本,所以我想在Bash腳本的開頭就這樣做。
有沒有辦法檢查Perl腳本是否沒有編譯錯誤?
當心!!
使用下面的命令檢查Perl程序中的編譯錯誤可能是危險的。
$ perl -c yourperlprogram
蘭德爾寫關於這個主題非常好文章,你應該看看
從他的文章引用:
也許si我們可以說最簡單的事情是「它有效嗎?」。對於這一點,我們 調用Perl本身,通過唯一的編譯開關:
perl -c ourprogram
對於此操作,perl的編譯程序, 但停止只是短暫的執行階段。這意味着程序文本的每個 部分都被翻譯成代表工作程序的內部數據結構 ,但我們並沒有實際執行 任何代碼。如果有任何語法錯誤,我們會通知您,編譯將中止。
其實,這是一個謊言。由於BEGIN塊(包括 它們的分層表示,使用指令),在理論上安全的「語法檢查」期間,某些Perl代碼可能會執行 。對於 例如,如果你的代碼包含:
BEGIN { warn "Hello, world!\n" }
然後你會看到,即使是在Perl的-c 該消息!這對於那些認爲「僅編譯」意味着「不執行代碼」的人來說有些令人驚訝。考慮 代碼包含:
BEGIN { system "rm", "-rf", "/" }
,你會看到的問題 這樣的說法。哎呀。
除了perl -c program.pl
,這也是更好地使用命令查找警告:
perl -w program.pl
有關詳細信息,請參閱:http://www.perl.com/pub/2004/08/09/commandline.html
當你需要檢查錯誤/運行前警告,但你的文件依賴您可以添加多個其他文件選項-I:
perl -I /path/to/dependency/lib -c /path/to/file/to/check
編輯:從人perlrun通過-I指定
目錄前加上用於模塊(@INC)的搜索路徑。
感謝您瞭解該方法的侷限性。順便說一句,我應該如何管perl -c輸出? 'perl -c script.pl | grep「語法OK」'不能按預期工作。我希望它在包含編譯錯誤時不會返回任何內容。 – user13107
沒關係,明白了! 'perl -c script.pl |&grep「語法OK」' – user13107
最好檢查一下實際的退出值,而不是grep的某些字符串輸出。如果成功,退出值將爲0,如果失敗,則退出值爲非零。 –