我应该在所有脚本上都使用* .sh和* .rb文件扩展名吗?


20

我的$ HOME / bin目录中有一堆手动滚动的可执行脚本。有些用bash编写,有些用Ruby编写。他们所有人的顶部都有shebang行,告诉shell使用什么解释器(在我的例子中是bash或Ruby)。

我想知道将文件扩展名放在这些脚本上以指示它们使用的脚本语言是否更好?例如,Ruby中的脚本将带有* .rb后缀,而bash的脚本将带有* .sh后缀。

当前,这些脚本仅具有简单名称,没有文件扩展名。

最佳做法是什么?


1
从shebang转换为扩展名并通过一个简单的脚本返回就足够容易了。因此,请尝试一种,并在以后进行修复。
亚伦·朗

Answers:


9

您可以执行通配符命令,例如ls *.rbcp *.sh如果将来要组织脚本,也可以这样做。

我认为,应尽早开始或稍后后悔。

类似的编辑器vim也将能够根据shebang或文件扩展名应用正确的语法突出显示。

这也可以通过在各种编辑器中使用模式行来实现。例如vim:

# vim: ft=sh

2
恕我直言,组织最好通过功能来完成,而不是通过实现细节来完成。
grawity 2011年

4
@grawity:尽管如此,后缀的组织比grepping for shebang更简单...
akira

尽管我同意全局原因,但大多数编辑器都很聪明,可以阅读shebang来确定文件类型。
Rich Homolka'9

10

嗯-就像生活中的大多数事情一样:这取决于您的需求。

您说过这些脚本位于bin目录中,并且我假定将从命令行调用这些脚本。作为用户,如果必须键入bla.ksh或foo.bash,我认为这很烦人。另外,如果编码人员决定改用其他解释程序,则命令名称也将更改,并且我将不得不修改使用这些工具的其他脚本-非常烦人,即使用户编码人员是同一个人。

但是另一方面,我在项目构建目录中使用.sh或.tcl之类的扩展名。这样,我可以利用make功能将文件部署到目标目录中-但是在此阶段,我删除了文件后缀。


6

显然,bin目录中的可执行文件与可编辑的“源”文件之间存在一些差异。

  • 对于源文件,有一个后缀是很有用的,这样您可以看到什么是什么,并帮助一些智能程度较低的工具无法扫描#!行。
  • 为模块,他们只使用一组相关的程序,所有这些都使用相同的解释器(或没有翻译),并且它是常规的,包括.pm.sh.so在这样的情况。
  • 对于可执行程序,其名称是“编程协议”的一部分,用户和其他脚本通过该协议来调用它。重要的是,即使实现更改名称也不要更改。如此明显的文件名应该不会有后缀

对于已编译的程序,“源”和“可执行”之间的区别是显而易见的:一个包含源代码,另一个包含机器语言或解释的字节码。对于脚本,没有明显的区别,但是make命令在“脚本的源代码”和“脚本的可执行版本”之间保持了名义上的分隔:“ shell脚本”的默认“编译器”很简单cp

我建议保留一个单独的$HOME/source目录,或者:

  • 保持符号链接,例如ln -s ../source/foo.sh $HOME/bin/foo;要么
  • 进行更改(和测试)后,使用手动复制它们install -m 755 foo.sh ../bin/foo;要么
  • 使用Makefile规则执行语法检查,然后再将源文件从中复制$HOME/source$HOME/bin

脚注:一个shell脚本模块只能由另一个shell脚本使用,并使用.source内置命令修改该脚本的内部上下文。这不同于可执行脚本,可执行脚本(像任何程序一样)作为单独的进程运行,并且不能修改其父进程。作为一个粗略的约定,模块进入/usr/lib/name_of_program/name_of_module.sh而命令进入/usr/bin/name_of_command(不带任何后缀)。


3

这不是必需的。内核已经知道了要使用的正确解释器(通过该#!行),并且所有流行的文本编辑器也都读取了该解释器,因此添加扩展名没有任何用处,只会增加键入。可执行程序唯一具有扩展名的时间是对它(对程序或用户或两者而言)具有某种意义时。


另一方面,模块和库几乎总是具有扩展名(.rb对于Ruby模块,.so对于ELF共享库,等等)。


问题不是关于“如果我不提供后缀,内核是否能够运行它”,而是关于“它对我有帮助吗”。类型字符的增加与完成无关。
akira
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.