bash能显示函数的定义吗?

k10*_*107 245 bash function

有没有办法在bash中查看bash函数的定义?

例如,假设我定义了该函数 foobar

function foobar {
    echo "I'm foobar"
}
Run Code Online (Sandbox Code Playgroud)

以后有没有办法获得foobar运行的代码?

$ # non-working pseudocode
$ echo $foobar
echo "I'm foobar"
Run Code Online (Sandbox Code Playgroud)

Ben*_*ier 332

使用type.如果foobar例如在您的~/.profile:

$ type foobar
foobar is a function
foobar {
    echo "I'm foobar"
}
Run Code Online (Sandbox Code Playgroud)

这确实找出了什么foobar,如果它被定义为一个函数,它调用declare -fpmohandras解释.

要打印出函数体(即代码),请使用sed:

type foobar | sed '1,3d;$d'
Run Code Online (Sandbox Code Playgroud)

  • @gman 我也有同样的问题。您可能正在使用 zsh。在这种情况下,“declare -f function_name”将在 bash 和 zsh 上运行 (5认同)
  • 这对我不起作用。它不显示函数的定义,仅显示它来自哪个文件。 (4认同)
  • `type` 也会扩展别名,这是一个很好的好处:) (3认同)
  • @sjsupersumit该问题明确要求Bash解决方案。 (2认同)

pmo*_*das 191

您可以使用declare在bash中显示函数的定义.例如:

declare -f foobar
Run Code Online (Sandbox Code Playgroud)

  • 很好,即使在其他加载的脚本文件中定义了函数时也能工作。也适用于 zsh。 (4认同)
  • 在zsh中工作.选定的答案对我不起作用. (4认同)
  • 如果使用`typeset -f`,则在非Linux系统上使用旧shell (2认同)

小智 7

set | sed -n '/^foobar ()/,/^}/p'
Run Code Online (Sandbox Code Playgroud)

这基本上打印了 set 命令中以函数名称 foobar () 开头并以 } 结尾的行

  • 我非常惊讶“set”输出 a) 注释被删除,b) 规范化了函数名称和括号之间的空白。我仍然不愿意使用它,因为可能存在包含“}”的变量,这可能会导致简单的解析失败。 (3认同)

pyr*_*ope 5

set | grep -A999 '^foobar ()' | grep -m1 -B999 '^}'
Run Code Online (Sandbox Code Playgroud)

foob​​ar是函数名称.

  • 问题:只显示第一个"}",当定义包含确实Bash允许的"{...}"嵌套时,这不是一切. (4认同)
  • 如果函数包含包含大括号模式的here-doc/here-string,也可能失败 (2认同)