我注意到我可以.txt
很好地读取没有扩展名的文本文件。怎么会?我应该保存这些文件时带或不带.txt
扩展名吗?
另外,文件呢.ini
?我通常这样使用它们:config.ini
, 我应该删除这里的扩展名吗?
任何有关 Linux 如何处理文件扩展名的通用资源都会很有用。
答案1
UNIX/Linux 不具有 Windows 那样的早期 DOS/CP/M 传统。因此,扩展对于大多数 UNIX 实用程序和工具来说通常不太重要。
我通常使用仅命令行环境。 Linux 下的此类环境中的扩展除了为操作员或用户提供方便之外并不真正重要。 (我没有足够的 KDE 或 GNOME 经验,不知道他们的文件管理器如何处理扩展。)
但这种便利通常很重要。如果config.ini
确实是微软标准的“.ini”格式,我会让扩展名保留。在 Linux 中,纯旧文本文件通常不带扩展名,但这并不适用于所有程序配置文件。程序员通常可以决定这一点。
我认为“.txt”在 Linux 下很有用,如果你想强调它不是配置文件或其他机器可读的文档。然而,在源代码发行版中,惯例是命名此类文件时全部大写,不带扩展名(即 README、INSTALL、COPYING 等)。
有一些标准和约定,但没有什么可以阻止您随意命名任何内容,除非您与他人共享内容。
在 Windows 中,命名文件.exe
向 shell(通常explorer.exe
)表明它是一个可执行文件。 UNIX 将这些知识构建到文件系统的权限中。如果设置了正确的x
位(请参阅参考资料),它就会被 shell 和内核函数识别为可执行文件(我相信)。man chmod
除此之外,Linux 不关心,大多数 shell 也不关心,大多数程序都会在文件中查找它的“类型”。
当然,有一个很好的命令file
可以分析文件并在一定程度上告诉您它是什么。我相信,如果它无法将文件中的数据与任何已知类型相匹配,并且如果它仅包含可打印的 ASCII/Unicode 字符,那么它会假定它是一个文本文件。
下面的@Bruce Ediger 是绝对正确的。在内核或文件系统级别(即Linux本身)中没有任何东西强制或关心文件的内容需要与其名称或应该理解它的程序相匹配。这并不意味着无法创建 shell 或启动器实用程序来根据文件名执行操作。
答案2
与 Windows 不同,在 UNIX 系统中,文件类型不是由扩展名决定的。文件扩展名过去只是人类的视觉指示器。您可以将 JPEG 命名为 foo.c 并在 Gimp 中打开它。与 Windows 的另一个对比是,在 UNIX 系统上您必须使用整个文件名,而 Windows 通常会为您处理它(例如,仅运行explorer
与explorer.exe
)。在 UNIX 上foo.sh
必须称为 as foo.sh
,而不是简单的foo
。
按照惯例,人们倾向于使用一组通用的扩展。这种做法虽然没有必要,但可能对整个人类有益。
答案3
总的来说,我发现保持严格的、描述性的命名约定非常有帮助。在 Unix 中你不需要这个扩展,但我保留它有两个原因:
1) 如果该文件将被 Windows 机器读取,则打开它会比尝试查找“打开方式...”更容易。
2) 扩展可以帮助用户了解文件的用途。在我们的实验室中: .txt = 文本文件 .sgi = irix 编译的二进制文件 .linux = linux 编译的二进制文件
如果您必须使用较旧的 unix 机器(我们仍然使用 IRIX),请记住 *nix 机器中的回车符是不同的,如果您尝试使用 Windows 回车符打开文件,程序可能无法识别。
答案4
有几个很好的答案。我想进一步回答最初问题的一部分:“任何有关 Linux 如何处理文件扩展名的通用资源都会很有用。”
可以注册扩展,这样Linux总是用某些程序打开某些扩展。这个设施被称为宾夫特。
binfmt_misc 是 Linux 内核的一项功能,它允许识别任意可执行文件格式并将其传递给某些用户空间应用程序,例如模拟器和虚拟机。可执行格式通过专用文件系统接口(类似于/proc)注册。基于 Debian 的发行版通过额外的 binfmt 支持包提供该功能。
每种格式在 /proc/sys/fs/binfmt_misc 目录中都有一个相应的文件条目,可以读取该文件条目以获取有关给定文件格式的信息。