如何找到定义bash函数的文件?

如何找到定义bash函数的文件?

我不知道如何找到定义 bash 函数的文件(__git_ps1在我的例子中)。

我尝试了declare, type, which,但没有告诉我源文件。我在某处读到declare可以打印文件名和行号,但没有解释如何打印。help的页面也declare没有说。

我怎样才能得到这些信息?

答案1

如果您准备运行该函数,那么您可以通过使用set -x跟踪执行并设置PS4变量来获取信息。

  1. 使用 启动 bash--debugger或使用它shopt -s extdebug来记录额外的调试信息。

  2. 设置PS4,跟踪时打印的“提示”以显示源行。

  3. 打开追踪。

  4. 然后您可以运行您的函数,并且对于每一行,您将获得该函数的文件名。

  5. 用于set +x关闭跟踪。

所以对于这种情况你会运行

bash --debugger
PS4='+ ${BASH_SOURCE[0]} '
set -x ; __git_ps1 ; set +x

答案2

如果您不愿意运行该功能,您仍然可以设置调试并获取信息。步骤是

  1. 开始bash --debuggershopt -s extdebug在定义函数之前。
  2. declare -F __git_ps1

它会报告函数的定义位置。

与使用 PS4 查看带注释的执行轨迹相比,此方法的优点是

  • 输出少了很多
  • 直接回答了问题

执行跟踪的优点是

  • 立即查看所有调用的函数
  • 查看调用函数之间的关系
  • 参见递归

强烈地建议shopt -s extdebug在两者的开头~/.bashrc~/.bash_profile涵盖不同的内容文件用于不同的祈求案例。

答案3

在 中似乎不可能bash,但在 中却可以zsh

$ type __git_ps1
> __git_ps1 is a shell function from /usr/share/git/git-prompt.sh

答案4

声明一个具有相同名称的函数并尽早将其设置为只读,然后激活 xtrace 模式,如下所示:

__git_ps1(){ :;}
readonly -f __git_ps1
set -x

之后,当您登录时,您将看到包括文件来源的跟踪信息。当尝试声明现有只读函数时,您将看到一条错误消息。前面的最后一个源文件应包含您要查找的声明。

您可能需要将其放入系统 bash 配置文件中。还要记住在找到罪魁祸首后恢复更改。

相关内容