为什么不让.txt文件可执行而不是.sh文件来运行脚本?

为什么不让.txt文件可执行而不是.sh文件来运行脚本?

我想知道为什么需要将可执行命令放入.sh文件中来制作单个脚本,因为我可以通过将命令放入.txt文件中并使用使其可执行来执行相同的操作chmod

我假设可以使用任何文件扩展名来完成此操作。因此,我对.sh扩展名的必要性感到很困惑。任何帮助都将不胜感激。

答案1

正如您正确发现的那样,文件扩展名不需要匹配任何特定内容。

在类 Unix 系统中,文件类型通常由文件内容(即前几个字节中的“魔法数字”或其他特征结构)而不是文件名称得出。您也可以完全省略扩展名,这通常是针对可执行文件进行的。

检查file命令,它会向您显示它可以从文件内容中找到的有关文件类型的信息。

对于可执行脚本,系统期望第一行有一个所谓的“shebang”,例如

#!/usr/bin/env python3

并指示使用脚本文件作为参数运行哪个程序作为解释器。如果您执行没有此类 shebang 的文本文件,它将使用您的默认 shell(即 Bash)尝试解释它。

因此,在 Unix/Linux 系统上,文件扩展名主要是提示(但不保证)以便人类用户快速识别特定文件包含的内容。这也是一种惯例,例如,可以帮助更快地找到文件。

请注意,但也有一些例外,其中名称和扩展名很重要(例如,某些系统配置文件必须遵循命名约定,或者许多图像查看器和编辑器也需要扩展名来指示文件类型)。

您还可以查看文件扩展名有任何用途吗(对于操作系统)?

答案2

UNIX/Linux 文件名中没有文件“扩展名”或“类型”之类的东西。

正如其他人指出的那样,假设您的系统上有相关的魔法,则可以使用文件命令找到“类型”。 UNIX/Linux 文件名通常可以包含任何可用字符,但使用某种形式的约定通常很有帮助,这样人类和机器都可以对内容(以及内容的使用)做出判断。

例如,我经常使用逗号作为文件名的第一个字符来表示临时文件,而不是在文件名末尾使用字符串“.tmp”之类的东西。结果是相同的,一个文件可能只包含短时间内需要的数据,但名称中不需要有“。”,也不需要字符串“tmp”。这有时可能会有优势,例如在解析文件名列表时。但这是我的惯例,其他人可能会决定使用另一个,甚至使用“.tmp”作为临时文件名称的惯例。

所以我的回答是,根本不存在 UNIX/Linux 文件扩展名,它仅仅是一组约定,通常看起来像其他操作系统及其文件系统中使用的文件扩展名。

相关内容