shell脚本中的main函数在哪里?

vik*_*ngh 8 shell bash shell-script

我正在使用 FUNCNAME 数组变量,它为我们提供了各种执行函数的名称。在使用它的过程中,我发现了main里面的函数${FUNCNAME[max_ind]}

main这个函数在我们的 shell 脚本中定义在哪里?里面写了什么代码main,如何使用?基本上这个函数的所有信息main

ilk*_*chu 14

这是 shell 脚本的主要级别。

FUNCNAME它本身似乎是 Bash 特有的,它的手册页是这样说的:

一个数组变量,包含当前执行调用堆栈中的所有 shell 函数的名称。索引为 0 的元素是任何当前正在执行的 shell 函数的名称。最底部的元素(索引最高的元素)是“main”。该变量仅在 shell 函数执行时存在。

这意味着它也可能会变得混乱,因为例如这个脚本:

#!/bin/bash
main() {
        foo
}
foo() {
        declare -p FUNCNAME;
}
main
Run Code Online (Sandbox Code Playgroud)

会打印

declare -a FUNCNAME=([0]="foo" [1]="main" [2]="main")
Run Code Online (Sandbox Code Playgroud)

即使这两个mains 不是相同的功能。

请注意,显式创建一个名为 的函数并不是那么牵强main。拥有专用的 main 函数可能有助于构建代码,因为主程序位于一个位置并且可能不会分散在其他函数定义之间的顶层的各处,因此阅读脚本可能会更容易。

还有一种习惯用法是将所有内容都放在函数中并main "$@"; exit在主级别上调用,以确保如果脚本文件在执行过程中被修改,则不会影响正在运行的脚本。请参阅:如何在执行之前读取整个 shell 脚本?

我不知道为什么 Bash 选择在那里使用,而不是像Python 用于类似用途的main更突出的东西。__main__

  • @AustinHemmelgarn,兼容模式仍然支持不与任何标准行为冲突的扩展(但例如只是标准 shell 中的语法错误)更像让我思考“为什么有人不这样做”。但这是一个似乎有点偏离主题的讨论。 (2认同)