查找 bash 函数的定义

pyt*_*hor 48 bash shell

我在一个有很多遗留 shell 脚本魔法的环境中工作。在命令行中大量使用的一件事是 bash 函数,这些函数来自某个文件中包含的某个文件,这些文件包含在某个文件中……包含在我的 .bash_profile 中。有没有办法在不通过 5 个级别的包含跟踪它们的情况下获得这些函数的定义甚至更好的定义位置?

Hai*_*Dog 72

假设您有一个名为 foo 的函数,下面的命令将获取该函数定义的位置,即它将获取定义该函数的文件的名称以及该函数在该文件中定义的行号.

# Turn on extended shell debugging
shopt -s extdebug

# Dump the function's name, line number and fully qualified source file  
declare -F foo

# Turn off extended shell debugging
shopt -u extdebug
Run Code Online (Sandbox Code Playgroud)

在我的情况下,这些命令的输出是:

foo 32 /source/private/main/developer/cue.pub.sh
Run Code Online (Sandbox Code Playgroud)

  • @Neil:这很方便,谢谢:让我建议使用子shell 来本地化`shopt` 的效果而不改变当前shell 的状态:`whichfunc () ( shopt -s extdebug; declare -F "$1"; )`(注意使用 `(...)` 而不是 `{...}`)。 (5认同)
  • 完美的。我只是在我的 bashrc 文件中把它变成了一个 bash 函数。`whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}` (3认同)
  • 这应该是公认的答案。 (2认同)

Den*_*son 47

获取函数定义:

type -a function_name
Run Code Online (Sandbox Code Playgroud)


Jos*_*erg 12

要查看函数的定义(而不是它的来源),请使用:

declare -f <functionname>
Run Code Online (Sandbox Code Playgroud)


Ign*_*ams 7

bash -x将在 bash 启动时转储它正在运行的内容,这应该让您更轻松地跟踪它。不要忘记退出新打开的外壳。