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


18

我想知道将可执行命令放入.sh文件中以制作单个脚本的需求是什么,因为我可以通过将命令放入.txt文件中并使用使其可执行来做到这一点chmod

我假设可以使用任何文件扩展名来完成此操作。因此,我对.sh扩展的需求感到困惑。任何帮助将非常感激。


19
Unix传统上并不关心文件扩展名。所以您是正确的-没关系。纯粹是为了让读者知道它是一个shell脚本
vidarlo

8
操作系统不以任何实际方式使用Linux中的文件扩展名。放置.sh扩展名只是告诉用户它是一个Shell脚本,而不是某些其他类型的文件,例如python或perl脚本。就个人而言,我不会在脚本上添加扩展名。
doneal24 '18年

2
仅需要告诉您或其他查看它的人,它就是一个shell脚本。如果您不在乎告诉哪些.txt文件是要运行的脚本,哪些是要在编辑器中打开的文本,请随时为所有.txt命名!
daboross '18年

2
Right.txt,but.txt if.txt everything.txt以.txt.txt the.txt .txt suffix.txt结尾。 (.txt)、. txt(.txt)、. txt(.txt)。
大约

1
类似于假定为重复的问题,但该问题实际上并未回答。
肯尼·埃维特

Answers:


47

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

在类Unix系统上,文件类型通常是从​​文件的内容(即前几个字节中的“幻数”或其他特征结构)派生而来,而不是从名称中派生。您也可以完全省略扩展名,该扩展名通常是针对可执行文件执行的。

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

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

#!/usr/bin/env python3

并以脚本文件作为参数指示要作为解释器运行的程序。如果您执行的文本文件没有这种Shebang,它将使用您的默认Shell(即Bash)尝试对其进行解释。

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

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

您也可以看一下文件扩展名是否有任何用途(用于操作系统)?


3
文件扩展名在外壳中无关紧要,但是在GUI OS的世界中,您非常需要它们才能使双击正常工作。
BallpointBen

@BallpointBen两点无关。即使在GUI下,文件的“类型”也可以作为元数据存储在一起,并且可以触发特定的执行,而无论其扩展名是什么。MacOS没有文件扩展名,并且是一个GUI,可以很好地保存下来……
Patrick Mevzek,

1
@PatrickMevzek MacOS怎么没有扩展名?我启用了显示功能,所有文件都有它们。我想念什么吗?我是MacOS平台的
新手

1
@CiprianTomoiagă您可以根据自己的喜好命名文件,操作系统不需要扩展名即可在它们上正常工作。例如见:howtogeek.com/192628/...
帕特里克Mevzek

1
@barbecue的目标是最低的公分母...这可能会导致问题:-)(例如,通过电子邮件附加文件something.com.txt的攻击,以及欺骗技巧,将.txt跳过为.com,因为这在Windows-land中是特定含义)。确实,对于互操作性,文件扩展名可能是一个好习惯。人们必须了解,尽管这显然是DOS基本上引入的缺陷,并且各种OS对没有扩展名的文件都非常满意。
Patrick Mevzek '18年

3

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

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

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

因此,我对您的回答是,没有UNIX / Linux文件扩展名之类的东西,而只是一组通常看起来像其他操作系统及其文件系统中使用的文件扩展名的约定。


FWIW,我自己也使用非标准约定。我的脚本以名字开头,"."这些脚本应由外壳点缀(它们不能在子外壳中有意义地运行)。相应地,我在使用的别名/脚本中禁用了默认的“初始点=隐藏文件”约定,ls这样我就可以看到所有文件,包括“隐藏”文件。同样在Windows上,我禁用“隐藏文件扩展名”设置。
jrw32982支持Monica
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.