查找bash函数的定义


41

我的工作环境中有很多遗留的Shell脚本魔术。bash函数是从命令行中大量使用的东西,它们从我的.bash_profile中包含的某个文件中包含的某个文件中获取。有没有一种方法可以获取这些功能的定义,甚至更好地定义这些功能的位置,而无需跟踪5个包含级别?

Answers:



66

假设您有一个名为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

就我而言,这些命令的输出为:

foo 32 /source/private/main/developer/cue.pub.sh

3
完善。我只是在bashrc文件中将其设置为bash函数。whereisfunc() {shopt -s extdebug;declare -F $1;shopt -u extdebug}
尼尔

5
@Neil:很方便,谢谢:让我建议使用子shell定位的效果,shopt而不更改当前shell的状态:(whichfunc () ( shopt -s extdebug; declare -F "$1"; )请注意使用(...)代替{...})。
mklement0

为什么这些命令在脚本中不起作用?功能正常工作
albfan

1
这应该是公认的答案。
解散

11

要查看函数的定义(与它的来源相反),请使用:

declare -f <functionname>

我认为这要好于type -a不打印依赖于
恼人

1
但因为没有给定的位置,这是一个答案,一个没有提出的问题,至少没有提出的在这里
反传统的人


-2

换句话说,我最近发现更简单:

  which <functionname>

(这还将显示它是别名还是脚本,但不会跟踪别名的来源)


2
我认为没有which提供有关BSD或Mac上别名的信息。此外,此问题与功能有关,而which没有提供有关功能的信息。
dbn

感谢您的来信。现在,我看到“哪个”仅解析zsh中的功能,而不解析bash。
Joshua Goldberg 2013年

2
我认为这个答案很可能会招致低票...似乎根本没有解决这个问题,因为没有位置信息。
iconoclast

我发现它对于跟踪声明以使用它,查明它是别名还是函数以及了解声明它的语法很有用。尽管只有@HairOfTheDog的答案直接给出了文件,这是事实。
Joshua Goldberg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.