Unix Shell脚本的文件扩展名


45

在Wikipedia上,.sh的文章说:

有关.sh文件扩展名的类型,请参见Bourne shell

其他的unix shell怎么样?

我知道在文件内部 使用了shebang来指示要执行的解释器,但是我想知道:

  • 文件扩展名与无文件扩展名的优缺点是什么?

4
有时,可以找到没有shebang(或没有执行权限)的shell脚本。在这种情况下,以.sh结尾的名称可以提示用户使用bash script.sh(或sh当然)运行它们。
Ansgar Esztermann '02

3
如果Shell脚本具有扩展名,则通常为.sh。我从未见过.ksh或.bash脚本。但是,大多数shell脚本都没有扩展名,例如/etc/init.d/*中的所有脚本。
理查德·霍洛威

虽然简单的结论(是或否)是观点,但要考虑的事情不是。
ctrl-alt-delor

Answers:


35

我只会叫.sh的东西是可移植的(希望便携式)。

否则,我认为隐藏语言会更好。细心的读者还是会在shebang行中找到它。(在实践中,.bash.zsh后缀等很少使用。)


1
仅从此页面,我们已经看到相当多的人在使用它。您为什么说它们“很少使用”?有引用吗?还是仅根据您的经验?
Pacerier's

23

我要说的是,严格地说,没有技术上的文件扩展名“好习惯”:Unix / Linux / * BSD文件系统本身不支持扩展名。您所说的扩展名只是单个文件名的后缀。这与VM / CMS,VMS,MS-DOS和Windows文件系统和OS有所不同,在VM / CMS,VMS,MS-DOS和Windows文件系统和OS中,等价于inode-moral的特殊位置保留用于扩展。

那个小家伙现在结束了,我认为在外壳程序脚本文件名上加上“ .sh”或“ .ksh”或“ .bash”后缀有点愚蠢。程序就是程序:区分执行的内容没有好处。没有Unix,Linux或任何内核决定仅由于文件名后缀而对某个文件调用解释器。这一切都是通过#!一行或文件开头的一些其他“魔术数字”字节序列完成的。实际上,基于文件名“扩展名”决定执行什么是使Windows成为恶意软件的诱人因素之一。查看有多少个Windows恶意软件诈骗涉及一个名为“ something.jpg.exe”的文件-默认情况下,较新的Windows不显示“ .exe”扩展名,而是鼓励用户双击“

无论如何,您可能会想到的直接命令通常就是shell脚本。有时cc是sh脚本,firefox是sh脚本,startx是sh脚本。我认为用“ .sh”后缀标记脚本不会带来认知或组织上的好处。


24
我不同意!我的工作包括打包一个应用程序,其中涉及数千个文件,从二进制可执行文件到Shell脚本(ksh,bash和某些旧版csh)。对我来说,相信我,一眼就能知道(或正则表达式)我们正在讨论和正在寻找的文件类型,这确实有所不同。我的观点是,区分被盗用的内容可能会有好处,最佳实践应鼓励明确说明文件的类型。
rahmu '02

4
@rahmu:写下来作为答案。提供一些有关正则表达式可区分名称如何帮助您打包(或维护)该应用程序的细节。请特别注意解释文件和文件名后缀之间的相互作用以及如何帮助您完成任务。我对反对我观点的严肃辩论感兴趣,并且如果我说服了,我愿意改变。我支持您的评论以证明这一点。
Bruce Ediger'2

3
我很乐意,不幸的是,我只能说一下我目前在我的工作中的经历。我对一般的良好做法和标准不太了解; 我觉得在发布答案之前我应该​​做一些研究。我会在下班后今晚研究它:)
rahmu 2012年

2
@rahmu存在用于确定文件类型的“文件”命令。它能够区分为不同shell编写的脚本。
马特

3
如果给Shell脚本.sh扩展名,则.sh在启动它时必须在命令名中键入该扩展名。这就是为什么我不喜欢添加该扩展名的主要原因(与具有shebang线的任何内容相同)。顺便说一句,Windows中的问题不是.exe前缀本身(image.jpg毕竟,在Linux中创建可执行文件并不容易),而是Windows通常隐藏该扩展名的事实,以及启动可执行文件所需的操作以及打开文档是完全一样的。
celtschk 2014年

12

作为在众多nix环境中工作的人,我不得不使用各种各样的shell进行编写。信不信由你,跨平台,外壳是不一样的。因此,如果您在多个外壳中维护个人库(必要时),则使用扩展名对外壳进行标识将非常有帮助。这样,当您转移到另一个平台并且外壳稍有不同时,您就知道要针对哪些脚本进行修改。.sh .ksh .bsh .csh ...



#!脚本开头是否没有(例如#!/bin/bash)?
ctrl-alt-delor

Gnu / Linux,BSD和UNIXes都是Unix。不需要?nix。Linux是内核,Android使用的是Linux,但不是Unix(除非您添加额外的软件,否则您将拥有Unix应用程序)。
ctrl-alt-delor

@ ctrl-alt-delor:“ Unix”是商标。人们经常使用“?nix”来避免商标问题(以及脚手架)。
JS。

@JS`UNIX'是The Open Group的商标。Unix和Unix不是greens.org/about/unix.html
ctrl-alt-

5

如您所说,Unix文件扩展名纯粹是信息。您只需要脚本具有正确的shebang即可执行。

您可以没有扩展名,也可以使用.sh

无论使用哪种shell(csh,tcsh,bash,sh,...),我都亲自使用以下约定:

  • 没有系统或高级脚本的扩展名(极为罕见)。
  • .sh对经典段子,从低到高档次。

“低级到高级的经典脚本”是什么意思?
Pacerier's

我想我的意思是抽象或组织级别。那就是您不在乎某些命令后面使用了哪种语言/脚本工具:因此您无需使用任何扩展名。对于其他人,最好知道它是bash或某些奇特的ksh shell脚本(具有适当的扩展名)。...但是那是2年前;)
Ouki 2015年

5

您不应该对可执行文件使用扩展名,因为它们不可互换。假设您有一个shell脚本a.sh,然后用python重新编写a.py,现在您必须更改每个调用您脚本的程序,并且泄漏了实现细节。

在Mircosoft的Windows中,整个文件扩展名都是一团糟:例如,可能是a.audio, b.audio, c.audio,是a.mp3, b.wav, c.oggd.picture, e.picture, f.pictured.jpeg, e.png, f.gif。大多数时候,我们不在乎音频或图片的格式。我们还必须花很长时间教新用户所有文件扩展名。


*.sh我刚遇到的另一个不使用的原因是Debian run-parts不会运行带有扩展名的脚本,例如/etc/cron.*/archive.oreilly.com/pub/post/runparts_scripts_a_note_about.html
Ross Patterson

3

Shell脚本扩展非常有用。例如,我经常编写在同一目录中具有多种语言(例如bash,awk和lua)的多个文件的脚本。如果只需要在bash文件中搜索字符串,该扩展名将非常方便,以减少误报。或者,如果我想对该项目的所有bash代码进行行计数。

在运行程序时必须键入扩展名是一件很痛苦的事,因此我也进行了没有扩展名到主要可执行文件的符号链接,以编辑/运行它而无需每次都键入扩展名。符号链接既便宜又容易。



2

正如其他人所说,shell并不关心扩展。但是,它确实允许快速人工识别文件。我看到以.py或结尾的文件,.sh并且我很快知道了(至少)应该是什么。正如史蒂夫所说,按文件扩展名搜索或进行行计数也是实际考虑。

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.