为什么“file”命令在处理.py文件时会混淆?

4

我有几个自己编写的Python模块。偶然间,我在这个目录上使用了file命令,结果让我非常惊讶。以下是它认为这些文件的统计信息:

  1 ASCII Java program text, with very long lines
  1 a /bin/env python script text executable
  1 a python script text executable
  2 ASCII C++ program text
  4 ASCII English text
 18 ASCII Java program text

很奇怪!你有什么想法,为什么它似乎认为Python模块经常是Java文件?

我正在使用CentOS 5.2。

编辑 这个问题更多地关注于我对明显非Java和非C++程序文件被归类为此类的好奇心。当然,我不指望file完美无缺,但对于它所做出的选择感到惊讶。我本来以为它会放弃并说这是文本文件,而不是做出非常不正确的推断。


2
只有当文件以#!/usr/bin/python#!/usr/bin/env python开头时,才能可预测地说它是Python脚本。 - Mikel
3个回答

6

我刚刚进行了一项测试,在每个错误识别的情况下,都没有shebang行。

对于每个具有以下内容的文件:

#!/usr/bin/env python

file 正确地识别了它。

查看 magic 文件,另一个触发将文件识别为 Python 文件的方法是在第一行使用三个引号。

$ echo '"""' | file -
/dev/stdin: python script text executable
$ echo '#!/usr/bin/python' | file -
/dev/stdin: python script text executable
$ echo '#!/usr/bin/env python' | file -
/dev/stdin: a python script text executable

4

来自file命令页面

file 命令尝试对每个参数进行分类。它分为三组测试,按顺序执行:文件系统测试、魔术数测试和语言测试。第一个成功的测试会导致文件类型被打印出来。

我猜测您的某些文件恰好符合不同语言的测试条件,因此导致了错误的文件识别结果。

另外,正如bug部分所指出的,file 命令通常用于二进制文件。

file 命令使用几种算法,更注重速度而不是准确性,因此它可能会误判文本文件的内容。

对于文本文件(主要针对编程语言),其支持方式简单、低效,需要重新编译才能更新。


2

我认为答案是第一个(非注释)出现的单词是import。对于所有被判定为Java的文件都是如此,尽管有一些被分类为文本的文件也是这样。被判定为C++的文件以class开头。import似乎是文件为Java的强烈线索,但不是最终确定因素。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接