I work in an environment that has a lot of legacy shell script magic lying around. One thing used heavy from the command line are bash functions that get sourced from some file included from some file included from some file ... included in my .bash_profile. Is there a way to get the definition or even better the location of the definition of these functions without tracking them down through 5 levels of includes?

link|improve this question

feedback

5 Answers

up vote 5 down vote accepted

To get the function definition:

type -a function_name
link|improve this answer
feedback

To see the definition of the function (as opposed to where it came from), use:

declare -f <functionname>
link|improve this answer
I think this one is better than type -a because it doesn't print the annoy locale dependent first line~~ – yuyichao Mar 16 at 1:50
feedback

Assuming you have a function named foo the commands below will get the location of the function's definition, that is it will get the name of the file in which the function is defined as well as the line number at which the function is defined within that file.

# 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

In my case the output of these commands is:

foo 32 /source/private/main/developer/cue.pub.sh
link|improve this answer
feedback

bash -x will dump what bash is running as it starts up, which should let you trace it more easily. Don't forget to exit the newly-opened shell.

link|improve this answer
feedback

another way, that I find even simpler lately:

  which <functionname>

(this will also show whether it's an alias or a script, but will not track down the source of an alias)

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.