读完的时候Google 的 shell 风格指南,我发现以下行让我有点困惑:“可执行文件应该没有扩展名(强烈推荐)或 .sh 扩展名。库必须有 .sh 扩展名,并且不应该是可执行的。”关联至少对于 bash 脚本来说,可执行文件和 bash 脚本库之间到底有什么区别?库中的脚本不是也是可执行的吗?
答案1
至少对于 bash 脚本来说,可执行文件和 bash 脚本库之间到底有什么区别?
我还没有听说过“库”这个词在 shell 脚本中使用过很多,如果我愿意的话,我会建议程序需要分成库这一事实意味着它最好在一些更好的编程中实现语言。
也就是说,我希望 shell 编程中的库与其他编程语言中的库类似:提供函数和子例程供其他程序使用,但其本身并不提供做任何特别与这些工具有关的东西。例如,一个库可能提供用于压缩/解压缩某些数据的工具,但是需要使用该库的程序来实现用于压缩/解压缩在命令行上命名的文件的命令行工具。
实际上,在 shell 中实现的程序会像任何程序一样正常执行,而 shell 库只包含函数定义,并且会从另一个 shell 脚本中获取这些定义。
例如,在下面的两个文件中,我可以将其称为main
程序和functions.sh
库。main
可以使可执行并执行为./main
. (或者放置在 中$PATH
,但functions.sh
也需要位于 in 中,$PATH
以便source
找到它。)请注意,虽然您可以运行 eg bash functions.sh
,但它不会执行任何操作。
main
:
#!/bin/bash
source functions.sh
say hello world
functions.sh
:
say() {
printf "%s\n" "$*"
}
关于可执行程序的要点不是拥有扩展可能与不公开实现有关。程序的用户不需要知道它是如何实现的,并且如果用 Perl 重新实现 shell 脚本,如果不调用它,则不会那么混乱foo.sh
,如果不需要更改名称(需要修改),则工作量也会减少给该程序的所有用户)。
不过,shell 函数库只能从 shell 脚本中使用,因此公开其中的实现做合理。
答案2
从 bash 的角度来看,库和可执行文件之间没有严格的区别。
从 Google 的风格指南来看,您所描述的部分解释了差异。
库必须有 .sh 扩展名并且不应该是可执行的
这些文件通常是一系列环境变量和函数定义。将它们作为可执行文件运行将不会执行任何操作。这些文件仅供其他脚本导入。
Google 风格指南鼓励您使用“.sh”后缀来标记它们,以向其他程序员/维护人员发出信号。
答案3
你引用的谷歌指南有点不清楚,但他们正在谈论文件其中包含例程。他们说一个文件为包含例程库而编写的文件不得设置任何执行位,并且文件名必须以.sh
.
这种库文件包含将被调用的例程,但不是执行一系列操作来完成特定工作的脚本。所以库文件中的代码是可执行的,但文件本身并不是“可执行的”。
这些是 Google 的脚本编写指南。他们描述了一种实践模式,可以帮助人们编写非常好的 shell 脚本,但它们并不是铁定的规则。 IMO 他们所说的关于省略库文件的执行权限的建议是非常好的建议。他们对文件名的看法并不那么重要(这不是特别好的或坏的建议)。
答案4
我想这指的是文件系统属性。
二进制文件和 shell 脚本将具有“chmod +x”可执行标志,库脚本(以免被错误地直接调用)不可执行。