我是否应该在所有脚本上都添加 *.sh 和 *.rb 文件扩展名?

我是否应该在所有脚本上都添加 *.sh 和 *.rb 文件扩展名?

我的 $HOME/bin 目录中有一堆手动编写的可执行脚本。有些是用 bash 编写的,有些是用 Ruby 编写的。所有这些脚本的顶部都有一行 shebang,告诉 shell 要使用哪个解释器(在我的情况下是 bash 或 Ruby)。

我想知道在这些脚本上添加文件扩展名以表明它们是用什么脚本语言编写的是否更好?例如,Ruby 中的脚本会有 *.rb 后缀,而 bash 脚本会有 *.sh 后缀。

目前,这些脚本只有简单的名称,没有文件扩展名。

最佳做法是什么?

答案1

如果您想在将来组织脚本,您可以执行类似ls *.rb或的通配符命令。cp *.sh

我认为,要尽早开始,否则以后就会后悔。

编辑者vim也可以基于以下情况应用正确的语法高亮:舍邦或文件扩展名。

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

# vim: ft=sh

答案2

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

您说这些脚本位于 bin 目录中,我假设这些脚本将从命令行调用。用户如果我必须输入 bla.ksh 或 foo.bash,我会觉得很烦人。此外,如果擔心者决定转移到另一个解释器,命令名称也会改变,我必须修改使用这些工具的其他脚本 - 非常烦人,即使用户擔心者是同一个人。

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

答案3

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(没有任何后缀)。

答案4

没有必要。内核已经被告知要使用的正确解释器(通过行#!),并且所有流行的文本编辑器也会读取它,因此添加扩展名不会有任何用处,只会增加输入。可执行程序只有在它在某种程度上很重要时才有扩展名(对程序或用户或两者而言)。


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

相关内容