2015-11-01 5 views
7

Мой разум был взорван, когда я случайно запустил скрипт bash, используя perl, и он ... работал. Экспериментируя дальше, кажется, 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 

гм ... ВТУ?

Для того, чтобы убедиться, что я не сумасшедший, я пытался делать это с другими переводчиками и подтвердил, что это просто жемчужно-изма:

$ 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», ни слова «INDIR» программа имени #! выполняется вместо интерпретатора Perl , Это немного странно, но помогает людям на машинах, которые не делают #!, потому что они могут сказать программе, что их SHELL /usr/bin/perl, и Perl отправит программу в правильный интерпретатор для них ,