2017-08-29 77 views
1

我想了解perl如何處理shebang線。Perl如何處理shebang行?

認爲,在命令行中的「命令位置」中提到的任何解釋將採取優先於家當行中提到之一。例如,如果一個可執行腳本調用demo看起來像這樣

#!/usr/local/bin/perl-5.00503 

printf "$]\n"; 

...然後我會注意以下事項:

$ ./demo 
5.00503 
% /usr/local/bin/perl-5.22 ./demo 
5.022003 

督察,在第一次執行,在家當解釋是一個在運行,而在第二個是在命令行中提到的那個。到現在爲止還挺好。

但現在,如果我改變對認領的「翻譯」成類似/usr/bin/wc,那麼它總是勝過任何perl解釋我提到在命令行上:

% cat demo-wc 
#!/usr/bin/wc 

printf "$]\n"; 

% ./demo-wc       # produces the expected behavior 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.22 ./demo-wc 
     4  3  31 ./demo-wc 
% /usr/local/bin/perl-5.14 ./demo-wc 
     4  3  31 ./demo-wc 

AFAICT,這種特殊的行爲似乎是有限的口譯人員perl;非perl解釋,如/bin/bash,做「否決」的家當:

% /bin/bash ./demo-wc 
$] 

的底線是perl似乎有處理取決於提到解釋的家當完全不同的策略。


  1. 如何perl確定遵循哪些策略?
  2. 這兩種情況下的政策究竟是什麼?
+1

已經在這裏回答:https://stackoverflow.com/a/29563961/152948 – hobbs

+1

@hobbs不完全,這回答了問題的一部分。 – zdim

回答

6

在您的測試中有幾種不同的情況。

當你使用./demo...時,內核在幻數(前16位)中找到#!並運行該程序,或者在失敗時將該行傳遞給shell,從而啓動它。

但是,當您在命令行上調用perl時,該二進制文件由shell啓動,然後perl解釋器自己處理shebang。在這種情況下,它會丟棄perl部分,但是如果行中包含「perl」,則會考慮開關–。

如果shebang不是而不是調用perl,我們對Perl有特殊的行爲。 從perlrun

如果#!行不包含單詞「perl」,也不是單詞「下載」,在#!命名的程序來執行的,而不是Perl解釋器。這有點奇怪,但它可以幫助那些不使用#!的機器上的人,因爲他們可以告訴程序他們的SHELL是/usr/bin/perl,然後Perl會將程序分發給他們的正確解釋器。

1

與大多數其他解釋器不同,perl自己處理#!行。這使得它可以接受多個選項參數,即使內核的#!處理程序只會傳遞一個字符串。

詳情請參閱perlrun手冊頁。您的相關部分是這樣的:

如果「#!」行不包含單詞「perl」,也不包含以「#!」命名的程序單詞「indir」。被執行而不是Perl解釋器。這有點奇怪,但它可以幫助那些不使用「#!」的機器上的人,因爲他們可以告訴程序SHELL是/ usr/bin/perl,然後Perl會將程序分發給正確的解釋器他們。