2015-11-01 34 views
7

當我意外地使用perl運行bash腳本並且它工作時,我的思緒被炸燬了。進一步的實驗,似乎讀的Perl腳本的家當並分派到正確的解釋:Perl根據shebang行發送給其他解釋器?

$ cat /tmp/ohhai.sh 
#!/bin/bash 
echo ohhai bash 

$ perl /tmp/ohhai.sh 
ohhai bash 

$ cat /tmp/ohhai.py 
#!/usr/bin/python2 
print 'ohhai python' 

$ perl /tmp/ohhai.py 
ohhai python 

$ cat /tmp/ohhai.groovy 
#!/usr/bin/groovy 
println 'ohhai groovy' 

$ perl /tmp/ohhai.groovy 
ohhai groovy 

嗯... WUT?

爲了確保我沒有瘋,我試圖與其他解釋這樣做的,證實這只是一個Perl主義:

$ python /tmp/ohhai.sh 
    File "/tmp/ohhai.sh", line 2 
    echo ohhai bash 
      ^
SyntaxError: invalid syntax 

$ ruby /tmp/ohhai.sh 
ruby: no Ruby script found in input (LoadError) 

$ bash /tmp/ohhai.py 
/tmp/ohhai.py: line 2: print: command not found 

是這有記錄嗎?這是一件新事物嗎? ...爲什麼?

確實是「瑞士軍鏈鋸」。

回答

10

這是perldoc perlrun記錄的舊事:

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