Str*_*ger 9 bash executable shell-script shared-library
在阅读Google 的 shell 样式指南时,我发现以下一行让我有点困惑:“可执行文件应该没有扩展名(强烈推荐)或 .sh 扩展名。库必须有 .sh 扩展名,并且不应该是可执行的。” 至少对于 bash 脚本来说,可执行文件和 bash 脚本库之间到底有什么区别?库中的脚本不是也是可执行的吗?
ilk*_*chu 15
至少对于 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
Run Code Online (Sandbox Code Playgroud)
functions.sh:
say() {
printf "%s\n" "$*"
}
Run Code Online (Sandbox Code Playgroud)
关于可执行程序没有扩展名的问题可能与不公开实现有关。程序的用户不需要知道它是如何实现的,并且如果用 Perl 重新实现 shell 脚本,如果不调用它,则不会那么混乱foo.sh,如果不需要更改名称(需要修改),则工作量也会减少给该程序的所有用户)。
不过,shell 函数库只能从 shell 脚本中使用,因此公开其中的实现确实有意义。
从 bash 的角度来看,库和可执行文件之间没有严格的区别。
根据 Google 的风格指南,您所描述的部分解释了这种差异。
库必须具有 .sh 扩展名并且不应该是可执行的
这些文件通常是一系列环境变量和函数定义。将它们作为可执行文件运行将不会执行任何操作。这些文件仅供其他脚本导入。
Google 风格指南鼓励您使用“.sh”后缀来标记它们,以向其他程序员/维护人员发出信号。
您引用的 Google 指南有点不清楚,但他们谈论的是包含例程的文件。他们说,写入包含例程库的文件不得设置任何执行位,并且文件名必须以.sh.
这种库文件包含将被调用的例程,但不是执行一系列操作来完成特定工作的脚本。所以库文件中的代码是可执行的,但文件本身并不是“可执行的”。
这些是 Google 的脚本编写指南。它们描述了一种实践模式,可以帮助人们编写非常好的 shell 脚本,但它们并不是铁定的规则。IMO 他们所说的关于省略库文件的执行权限的建议是非常好的建议。他们对文件名的看法并不那么重要(这不是特别好的或坏的建议)。
| 归档时间: |
|
| 查看次数: |
1878 次 |
| 最近记录: |