使用Perl执行Python脚本时,为什么没有语法错误?


85

我刚刚在中编写了一些测试python代码test.py,并按如下方式启动它:

perl test.py

一段时间后,我意识到自己的错误。我之所以说“一段时间”,是因为Python代码实际上已正确执行,就像在Python解释器中一样!

为什么我的Perl解释我的Python?test.py看起来像这样:

#!/usr/bin/python

...Python code here...

有趣的是,如果我做相反的事情(即call python something.pl),则会遇到很多语法错误。


6
我猜是因为#!文件的开头。的确,如果我删除了她的爆炸,我就会得到预期的行为。从安全角度来看,这不是一个坏主意吗?
Dacav 2015年

7
否。shebang路径中用于指定解释器的点。如果您不信任代码可以运行,那么您不应该首先运行它。
Sobrique 2015年

1
不,不是。您的脚本是一个文本文件。不多不少。没有翻译,它就不会“运行”。
Sobrique 2015年

4
“为什么我的Perl解释我的Python?” 不是“无法重现的问题或简单的印刷错误”。投票重新开放。在Q和A上的投票表明这是一个大众关注的问题。
ikegami 2015年

1
@ikegami无论受欢迎程度如何,这显然都不是“一个简单的印刷错误...以一种不太可能帮助未来读者的方式解决。” 投票重新开放。
ThisSuitIsBlackNotNot

Answers:


114

perlrun

如果该#!行既不包含单词“ perl”也不包含单词“ indir”,则将执行以命名的程序,#!而不是Perl解释器。这有点奇怪,但是它可以帮助那些不这样做的人#!,因为他们可以告诉程序其SHELL是/ usr / bin / perl,然后Perl会将程序分派给正确的解释器。

例如,

$ cat a
#!/bin/cat
meow

$ perl a
#!/bin/cat
meow

32
哇。谈谈您晦涩的功能。我使用Perl已有20多年了,但我不知道它能做到这一点。
cjm 2015年

4
我开始在DOS,VMS和Solaris上使用Perl v4。像这样的操作系统不可知/桥接功能使跨平台的工作变得如此轻松。
tjd 2015年

1
@MarcvanLeeuwen当您为Linux,OSX,VAX / VMS,Windows,Solaris,OS / 2等编写程序时,移植脚本语言程序最令人讨厌的部分就是启动它,尽管其中许多系统通常共享“键入命令,找到并执行命令”功能,几乎可以做其他所有事情。这Perl的功能令Perl在功能容易差距桥-你可以写只是一个Unix风格的家当,如果Perl是存在的代码,无论是Perl代码与否,总是工作-它像一个更加普遍#! /usr/bin/env foo
zxq9

1
@immibis从线程Shebang行解析perl5- porters邮件列表上的奥秘:“indir是一个旨在间接执行其他程序的程序。给您很大的帮助,并且/或者在OS内核将您限制为32个字符的命令行的情况下。”
ThisSuitIsBlackNotNot

2
这只是巩固了Perl作为编程语言的厨房接收器的声誉。作为一个有趣的观察,我相信shebang的最初实现是作为Shell功能,后来才移入Unix内核。Perl包含许多shell机制(例如,用反引号代替命令输出),这仅仅是一种。
Barmar 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.