unix shell 脚本的文件扩展名

Ame*_*ina 54 scripting conventions shell-script filenames files

在维基百科上,.sh的文章说:

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

其他unix shell怎么样?

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

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

Sté*_*nez 42

我只会调用旨在便携的.sh东西(希望便携的)。

否则我认为隐藏语言更好。细心的读者无论如何都会在shebang行中找到它。(在实践中,.bashor.zsh等……很少使用后缀。)

  • 仅从这个页面,我们就可以看到相当多的人在使用它。为什么说它们“很少使用”?有引用吗?或者这仅仅是基于您的经验? (3认同)
  • 我同意隐藏可执行文件的语言,但我会详细说明,这并不是“只是”更好,因为没有理由:它是非常具体的更好,因为将语言放在可执行文件名称中会将实现细节泄漏到接口中!为什么要预测未来并说您的程序将始终被编写为 shell 脚本,或者如果您有充分的理由用另一种语言重写它,那么为什么要撒谎或破坏向后兼容性呢? (2认同)

Bru*_*ger 27

我会说不存在文件扩展的“良好实践”,严格来说是技术性的:Unix/Linux/*BSD 文件系统本身不支持扩展。您所说的扩展名只是单个文件名的后缀。这与 VM/CMS、VMS、MS-DOS 和 Windows 文件系统和操作系统不同,其中 inode-moral-equivalent 中的一个特殊位置是为扩展保留的。

那个小小的咆哮现在结束了,我认为在 shell 脚本文件名上添加“.sh”或“.ksh”或“.bash”后缀有点愚蠢。程序就是程序:区分执行的内容没有任何好处。没有 unix 或 linux 或任何内核仅仅因为文件名后缀就决定在某个文件上调用解释器。这一切都是由#!文件开头的行或其他一些“幻数”字节序列完成的。事实上,根据文件名“扩展名”决定执行什么是使 Windows 成为恶意软件磁铁的因素之一。看看有多少 Windows 恶意软件诈骗涉及名为“something.jpg.exe”的文件——默认情况下,较新的 Windows 不显示“.exe”扩展名,并鼓励用户双击“

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

  • 我不同意!我的工作包括打包一个涉及数千个文件的应用程序,从二进制可执行文件到 shell 脚本(ksh、bash 和一些遗留的 csh)。对我来说,相信我 ** 确实** 能够一目了然(或在正则表达式中)知道我们正在讨论和我们正在寻找什么样的文件。我的观点是*可能*有利于区分被执行的内容,*最佳实践*应该鼓励明确说明文件类型。 (31认同)
  • @rahmu:写下来作为答案。提供有关正则表达式可区分名称如何帮助您打包(并可能维护)该应用程序的一些细节。请特别注意解释文件的内容与文件名后缀之间的交互,以及这如何帮助您完成任务。我对反对我观点的严肃争论感兴趣,如果我被说服,我愿意改变。我赞成你的评论来证明这一点。 (8认同)
  • 如果你给一个 shell 脚本一个 `.sh` 扩展名,你必须在启动它时输入 `.sh` 作为命令名称的一部分。这就是为什么我不喜欢把这个扩展放进去的主要原因(与任何有 shebang 线的东西一样)。顺便说一句,Windows 中的问题不在于 `.exe` 前缀本身(毕竟在 Linux 中制作名为 `image.jpg` 的可执行文件是微不足道的),而是 Windows 通常隐藏该扩展名的事实,结合事实启动可执行文件和打开文档所需的操作完全相同。 (7认同)
  • 我很乐意,不幸的是,我只能谈谈我目前在当前工作中的经验。我对良好的实践和标准知之甚少**一般**;我觉得我应该在这里发布答案之前做一些研究。我今晚下班后研究一下:) (3认同)
  • @rahmu 存在用于确定文件类型的“文件”命令。它能够区分为不同 shell 编写的脚本。 (3认同)

小智 15

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

  • 脚本开头没有“#!”(例如“#!/bin/bash”)吗? (2认同)

ctr*_*lor 9

您不应为可执行文件使用扩展名,因为它们不可互换。想象一下,你有一个 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.*/”:http://archive.oreilly .com/pub/post/runparts_scripts_a_note_about.html (2认同)

Ouk*_*uki 5

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

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

无论使用何种 shell(csh、tcsh、bash、sh...),我个人都使用以下约定:

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

  • “经典剧本,从低到高”是什么意思? (2认同)