在許多Perl腳本(尤其是在著名的CPAN發行版),我發現下面的代碼:Perl腳本中的「不在某些shell下運行」是什麼意思?
eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}'
if 0; # not running under some shell
我不知道它是什麼呢?
謝謝。
在許多Perl腳本(尤其是在著名的CPAN發行版),我發現下面的代碼:Perl腳本中的「不在某些shell下運行」是什麼意思?
eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}'
if 0; # not running under some shell
我不知道它是什麼呢?
謝謝。
某些系統在腳本啓動時無法識別#!/usr/bin/perl
行,因此試圖在此類系統上按名稱調用Perl程序只會將腳本傳遞到shell。爲了解決這個問題,可移植的Perl程序以一行代碼開始,當由一個標準的POSIX shell解釋時,它會導致腳本被傳遞給perl(1)
。 if 0
導致該行在被Perl本身運行時被忽略,並將其放在單獨的行上會導致shell將其視爲單獨的命令,只要讀取它就運行eval 'exec /usr/bin/perl -w -S $0 ${1+"[email protected]"}'
。
該行在shell和perl下都是有效的。在perl eval
由於以下if 0
而被跳過。在shell中,使用eval在perl
中執行相同的文件。
是的,這個ID也很好的澄清。再次感謝! – 2012-02-04 19:34:03
非常感謝!真的很聰明! – 2012-02-04 19:30:49
我不知道是否還有任何系統值得擔心,不支持[shebangs](http://en.wikipedia.org/wiki/Shebang_(Unix))。 – 2012-02-04 19:50:07
我有腳本可以執行此操作,以便它們可以在Solaris和Linux下運行。 shebang指向Solaris perl,但在Linux下,該腳本作爲shell執行,並且eval行執行Linux perl。 perls安裝在奇數位置,但文件/目錄是通過NFS在系統之間共享的。 – runrig 2012-02-04 22:44:04