2010-12-21 53 views
3

最近我看了CPAN上的一個模塊,該模塊附帶了一個要安裝的腳本 ,這讓我感到驚訝。將 中的腳本包含在公共CPAN中,並且如果對於將在內部CPAN服務器上發佈的 軟件包有任何不同建議,建議採用什麼方式?爲CPAN(和CorporatePAN)打包perl腳本的推薦方式是什麼?

劇本開始是這樣的:

#!/usr/bin/perl 

eval 'exec /usr/bin/perl -S $0 ${1+"[email protected]"}' 
    if 0; # not running under some shell 

兩個問題

難道我理解正確的EVAL部分是不必要的? 安裝期間將由CPAN客戶端嵌入,並且在Windows上安裝時,它將會有很大的不同。

什麼是推薦的sh-bang線? 那會是

#!/usr/bin/env perl 

而不是上面的?

回答

3

分發正在安裝時,它正在安裝對於某些特定的perl,並且應明確設置#!使用該perl(如在$Config{startperl}中給出的)。據我所知,所有的模塊安裝程序都爲你做這件事。 (更新:正如cjm所指出的那樣,只有#!as distributed纔會運行perl,而不是env。)

eval東西傳統上被包含在內,即使腳本調用sh scriptname時也會自動使用perl。這是無害的。

+0

實際上,'eval'是因爲'#!'[not invented](http://en.wikipedia.org/wiki/Shebang_%28Unix%29#History)直到Version 8 Unix。早期版本只是假設一個可執行文本文件必須是一個shell腳本。 – cjm 2013-04-13 19:05:40

6

只需使用

#!/usr/bin/perl 

(或者可選,無論路徑perl是在開發機器上。)

當模塊::編譯或MakeMaker的安裝腳本,它將改變#!行匹配安裝模塊的perl。它還將添加「eval exec」行,除了在Windows下,它將創建.bat文件。 (該CPAN客戶端無關,與此。)

如果使用

#!/usr/bin/env perl 

那麼安裝不會意識到這是一個Perl腳本,並不會修改#!線。

相關問題