How can I find where certain bash function is defined?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}







26















There are many functions that can be used in Bash shell. Their definitions can be listed by set, but how to find in which files certain user defined functions are defined?










share|improve this question




















  • 1





    Look at: askubuntu.com/questions/463462/…

    – FedonKadifeli
    May 26 at 9:49


















26















There are many functions that can be used in Bash shell. Their definitions can be listed by set, but how to find in which files certain user defined functions are defined?










share|improve this question




















  • 1





    Look at: askubuntu.com/questions/463462/…

    – FedonKadifeli
    May 26 at 9:49














26












26








26


6






There are many functions that can be used in Bash shell. Their definitions can be listed by set, but how to find in which files certain user defined functions are defined?










share|improve this question














There are many functions that can be used in Bash shell. Their definitions can be listed by set, but how to find in which files certain user defined functions are defined?







bash functions






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked May 26 at 9:23









jarnojarno

2,1463 gold badges22 silver badges52 bronze badges




2,1463 gold badges22 silver badges52 bronze badges











  • 1





    Look at: askubuntu.com/questions/463462/…

    – FedonKadifeli
    May 26 at 9:49














  • 1





    Look at: askubuntu.com/questions/463462/…

    – FedonKadifeli
    May 26 at 9:49








1




1





Look at: askubuntu.com/questions/463462/…

– FedonKadifeli
May 26 at 9:49





Look at: askubuntu.com/questions/463462/…

– FedonKadifeli
May 26 at 9:49










3 Answers
3






active

oldest

votes


















31














Turn on debugging. From the Bash manual:




extdebug



If set at shell invocation, or in a shell startup file, arrange to
execute the debugger profile before the shell starts, identical to the
--debugger option. If set after invocation, behavior intended for
use by debuggers is enabled:




  • The -F option to the declare builtin (see Bash Builtins) displays the source file name and line number corresponding to each
    function name supplied as an argument.




Example:



$ bash --debugger
$ declare -Ff quote
quote 143 /usr/share/bash-completion/bash_completion


And indeed:



$ nl -ba /usr/share/bash-completion/bash_completion | sed -n 143,150p
143 quote()
144 {
145 local quoted=${1//'/'\''}
146 printf "'%s'" "$quoted"
147 }
148
149 # @see _quote_readline_by_ref()
150 quote_readline()





share|improve this answer


























  • This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

    – jarno
    May 26 at 13:36






  • 2





    @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

    – bashity mcbashface
    May 26 at 13:48











  • Is there a similar method to find alias declaration locations?

    – FedonKadifeli
    May 26 at 15:31











  • @fedon my convoluted and complicated approach below should work.

    – terdon
    May 26 at 15:58











  • You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

    – wjandrea
    May 27 at 18:16





















15














This is actually more complicated than it appears at first. Which files are read by your shell depends on what type of shell you are currently running. Whether it is interactive or not, whether it is a login or a non-login shell and what combination of the above. To search through all the default files that can be read by the different shells, you can do (change $functionName to the actual name of the function you are looking for):



grep "$functionName" ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login 
~/.bash_aliases /etc/bash.bashrc /etc/profile
/etc/profile.d/* /etc/environment 2> /dev/null


If that doesn't work, you may be calling a non-default file using . or its alias source. To find such cases, run:



grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
~/.bash.login ~/.bash_aliases /etc/bash.bashrc
/etc/profile /etc/profile.d/* /etc/environment 2> /dev/null


That probably needs some explanation. The -P enables Perl Compatible Regular Expressions (PCRE) which let us use some fancier regex syntax. Specifically:





  • (^|s): match either the beginning of a line (^) or whitespace (s).


  • (.|source)s+ : match either a literal . character (.) or the word source, but only if they are followed by one or more whitespace characters.


Here's what that gives me on my system:



$ grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
> ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
> /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null
/home/terdon/.bashrc: . /etc/bashrc
/home/terdon/.bashrc: . /etc/bash_completion
/home/terdon/.bashrc:. $HOME/scripts/git-prompt.sh
/home/terdon/.bashrc:# echo -n "$n : "; grep "^CA" $n |perl -e 'my ($a,$c)=0; while(<>){$c++;next if /cellular_component_unknown/; next if /biological_process/; $a++} print "$a Classes of $c annotated (" . $a*100/$c . ")n"'
/etc/bash.bashrc:[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
/etc/profile: test -r "$profile" && . "$profile"
/etc/profile: . /etc/bash.bashrc
/etc/profile.d/locale.sh: . "$XDG_CONFIG_HOME/locale.conf"
/etc/profile.d/locale.sh: . "$HOME/.config/locale.conf"
/etc/profile.d/locale.sh: . /etc/locale.conf
/etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
/etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
/etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
/etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
/etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch


As you can see, however, this will print the entire matched line. What we are really interested in is the list of file names called, not the line that is calling them. You can get those with this, more complicated, regex:



grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
~/.bash.login ~/.bash_aliases
/etc/bash.bashrc /etc/profile
/etc/profile.d/* /etc/environment 2> /dev/null


The -h flag suppresses the printing of the file names where a match was found, which grep does by default when told to search through multiple files. The -o means "only print the matching portion of the line". The extra stuff added to the regex are:





  • K : ignore anything matched up to this point. This is a PCRE trick that lets you use a complex regex to find your match but not include that matched portion when using grep's -o flag.


On my system, the above command will return:



$ grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
> ~/.bash.login ~/.bash_aliases
> /etc/bash.bashrc /etc/profile
> /etc/profile.d/* /etc/environment 2> /dev/null
/etc/bashrc
/etc/bash_completion
$HOME/scripts/git-prompt.sh
$a*100/$c
")n"'
/usr/share/bash-completion/bash_completion
"$profile"
/etc/bash.bashrc
"$XDG_CONFIG_HOME/locale.conf"
"$HOME/.config/locale.conf"
/etc/locale.conf
/usr/bin/byobu-launch
/usr/bin/byobu-launch
/usr/bin/byobu-launch
/usr/bin/byobu-launch
/usr/bin/byobu-launch


Note that I happen to have a use of . followed by a space which is not used for sourcing but that's because I have an alias that is calling another language, not bash. That's what gives the weird $a*100/$c and ")n"' in the output above. But that can be ignored.



Finally, here's how to put all of that together and search for a function name in all default files and all files your default files are sourcing:



grep_function(){
target="$@"
files=( ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login
~/.bash_aliases /etc/bash.bashrc /etc/profile
/etc/profile.d/* /etc/environment)
while IFS= read -r file; do
files+=( "$file" )
done < <(grep -hPo '(^|s)(.|source)s+KS+' "${files[@]}" 2>/dev/null)
for file in "${files[@]}"; do
## The tilde of ~/ can break this
file=$(sed 's|~/|'"$HOME"'/|g' <<<"$file")
if [[ -e $file ]]; then
grep -H "$target" -- "$file"
fi
done
}


Add those lines to your ~/.bashrc and you can then run (I am using fooBar as an example function name):



grep_function fooBar


For example, if I have this line in my ~/.bashrc:



. ~/a


And the file ~/a is:



$ cat ~/a
fooBar(){
echo foo
}


I should find it with:



$ grep_function fooBar
/home/terdon/a:fooBar(){





share|improve this answer




























  • Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

    – jarno
    May 26 at 13:40











  • @jarno and it is much, much simpler! :)

    – terdon
    May 26 at 14:09











  • Arrays support +=

    – D. Ben Knoble
    May 27 at 15:16











  • @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

    – terdon
    May 27 at 19:31






  • 1





    @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

    – terdon
    May 28 at 12:43



















2














The usual per-user dotfile bash reads is ~/.bashrc. However, it may very well source other files, I for instance like to keep aliases and functions in separate files called ~/.bash_aliases and ~/.bash_functions, which makes finding them much easier. You can search the .bashrc for source commands with:



grep -E '(^s*|s)(.|source)s' /home/USERNAME/.bashrc


Once you have the list of user-created files you can search them and the user’s .bashrc with a single grep call, e.g. for function foo for my setup:



grep foo /home/USERNAME/.bash{rc,_aliases,_functions}





share|improve this answer






























    Your Answer








    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "89"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1146269%2fhow-can-i-find-where-certain-bash-function-is-defined%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    31














    Turn on debugging. From the Bash manual:




    extdebug



    If set at shell invocation, or in a shell startup file, arrange to
    execute the debugger profile before the shell starts, identical to the
    --debugger option. If set after invocation, behavior intended for
    use by debuggers is enabled:




    • The -F option to the declare builtin (see Bash Builtins) displays the source file name and line number corresponding to each
      function name supplied as an argument.




    Example:



    $ bash --debugger
    $ declare -Ff quote
    quote 143 /usr/share/bash-completion/bash_completion


    And indeed:



    $ nl -ba /usr/share/bash-completion/bash_completion | sed -n 143,150p
    143 quote()
    144 {
    145 local quoted=${1//'/'\''}
    146 printf "'%s'" "$quoted"
    147 }
    148
    149 # @see _quote_readline_by_ref()
    150 quote_readline()





    share|improve this answer


























    • This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

      – jarno
      May 26 at 13:36






    • 2





      @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

      – bashity mcbashface
      May 26 at 13:48











    • Is there a similar method to find alias declaration locations?

      – FedonKadifeli
      May 26 at 15:31











    • @fedon my convoluted and complicated approach below should work.

      – terdon
      May 26 at 15:58











    • You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

      – wjandrea
      May 27 at 18:16


















    31














    Turn on debugging. From the Bash manual:




    extdebug



    If set at shell invocation, or in a shell startup file, arrange to
    execute the debugger profile before the shell starts, identical to the
    --debugger option. If set after invocation, behavior intended for
    use by debuggers is enabled:




    • The -F option to the declare builtin (see Bash Builtins) displays the source file name and line number corresponding to each
      function name supplied as an argument.




    Example:



    $ bash --debugger
    $ declare -Ff quote
    quote 143 /usr/share/bash-completion/bash_completion


    And indeed:



    $ nl -ba /usr/share/bash-completion/bash_completion | sed -n 143,150p
    143 quote()
    144 {
    145 local quoted=${1//'/'\''}
    146 printf "'%s'" "$quoted"
    147 }
    148
    149 # @see _quote_readline_by_ref()
    150 quote_readline()





    share|improve this answer


























    • This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

      – jarno
      May 26 at 13:36






    • 2





      @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

      – bashity mcbashface
      May 26 at 13:48











    • Is there a similar method to find alias declaration locations?

      – FedonKadifeli
      May 26 at 15:31











    • @fedon my convoluted and complicated approach below should work.

      – terdon
      May 26 at 15:58











    • You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

      – wjandrea
      May 27 at 18:16
















    31












    31








    31







    Turn on debugging. From the Bash manual:




    extdebug



    If set at shell invocation, or in a shell startup file, arrange to
    execute the debugger profile before the shell starts, identical to the
    --debugger option. If set after invocation, behavior intended for
    use by debuggers is enabled:




    • The -F option to the declare builtin (see Bash Builtins) displays the source file name and line number corresponding to each
      function name supplied as an argument.




    Example:



    $ bash --debugger
    $ declare -Ff quote
    quote 143 /usr/share/bash-completion/bash_completion


    And indeed:



    $ nl -ba /usr/share/bash-completion/bash_completion | sed -n 143,150p
    143 quote()
    144 {
    145 local quoted=${1//'/'\''}
    146 printf "'%s'" "$quoted"
    147 }
    148
    149 # @see _quote_readline_by_ref()
    150 quote_readline()





    share|improve this answer













    Turn on debugging. From the Bash manual:




    extdebug



    If set at shell invocation, or in a shell startup file, arrange to
    execute the debugger profile before the shell starts, identical to the
    --debugger option. If set after invocation, behavior intended for
    use by debuggers is enabled:




    • The -F option to the declare builtin (see Bash Builtins) displays the source file name and line number corresponding to each
      function name supplied as an argument.




    Example:



    $ bash --debugger
    $ declare -Ff quote
    quote 143 /usr/share/bash-completion/bash_completion


    And indeed:



    $ nl -ba /usr/share/bash-completion/bash_completion | sed -n 143,150p
    143 quote()
    144 {
    145 local quoted=${1//'/'\''}
    146 printf "'%s'" "$quoted"
    147 }
    148
    149 # @see _quote_readline_by_ref()
    150 quote_readline()






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered May 26 at 12:53









    bashity mcbashfacebashity mcbashface

    3261 silver badge2 bronze badges




    3261 silver badge2 bronze badges
















    • This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

      – jarno
      May 26 at 13:36






    • 2





      @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

      – bashity mcbashface
      May 26 at 13:48











    • Is there a similar method to find alias declaration locations?

      – FedonKadifeli
      May 26 at 15:31











    • @fedon my convoluted and complicated approach below should work.

      – terdon
      May 26 at 15:58











    • You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

      – wjandrea
      May 27 at 18:16





















    • This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

      – jarno
      May 26 at 13:36






    • 2





      @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

      – bashity mcbashface
      May 26 at 13:48











    • Is there a similar method to find alias declaration locations?

      – FedonKadifeli
      May 26 at 15:31











    • @fedon my convoluted and complicated approach below should work.

      – terdon
      May 26 at 15:58











    • You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

      – wjandrea
      May 27 at 18:16



















    This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

    – jarno
    May 26 at 13:36





    This is a great and simple solution. As for your example, it is not even needed to start a new shell: shopt -s extdebug; declare -Ff quote; shopt -u extdebug.

    – jarno
    May 26 at 13:36




    2




    2





    @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

    – bashity mcbashface
    May 26 at 13:48





    @jarno ah, well, contrary to my name, I use zsh. That's why I started a new shell. :D

    – bashity mcbashface
    May 26 at 13:48













    Is there a similar method to find alias declaration locations?

    – FedonKadifeli
    May 26 at 15:31





    Is there a similar method to find alias declaration locations?

    – FedonKadifeli
    May 26 at 15:31













    @fedon my convoluted and complicated approach below should work.

    – terdon
    May 26 at 15:58





    @fedon my convoluted and complicated approach below should work.

    – terdon
    May 26 at 15:58













    You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

    – wjandrea
    May 27 at 18:16







    You could make this a function like this: find_function()( shopt -s extdebug; declare -F "$@"; ). With the parens on the function body, it gets executed in a subshell and the change to shopts doesn't affect the caller. And the -f doesn't seem to be needed.

    – wjandrea
    May 27 at 18:16















    15














    This is actually more complicated than it appears at first. Which files are read by your shell depends on what type of shell you are currently running. Whether it is interactive or not, whether it is a login or a non-login shell and what combination of the above. To search through all the default files that can be read by the different shells, you can do (change $functionName to the actual name of the function you are looking for):



    grep "$functionName" ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login 
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    If that doesn't work, you may be calling a non-default file using . or its alias source. To find such cases, run:



    grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null


    That probably needs some explanation. The -P enables Perl Compatible Regular Expressions (PCRE) which let us use some fancier regex syntax. Specifically:





    • (^|s): match either the beginning of a line (^) or whitespace (s).


    • (.|source)s+ : match either a literal . character (.) or the word source, but only if they are followed by one or more whitespace characters.


    Here's what that gives me on my system:



    $ grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    > /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null
    /home/terdon/.bashrc: . /etc/bashrc
    /home/terdon/.bashrc: . /etc/bash_completion
    /home/terdon/.bashrc:. $HOME/scripts/git-prompt.sh
    /home/terdon/.bashrc:# echo -n "$n : "; grep "^CA" $n |perl -e 'my ($a,$c)=0; while(<>){$c++;next if /cellular_component_unknown/; next if /biological_process/; $a++} print "$a Classes of $c annotated (" . $a*100/$c . ")n"'
    /etc/bash.bashrc:[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
    /etc/profile: test -r "$profile" && . "$profile"
    /etc/profile: . /etc/bash.bashrc
    /etc/profile.d/locale.sh: . "$XDG_CONFIG_HOME/locale.conf"
    /etc/profile.d/locale.sh: . "$HOME/.config/locale.conf"
    /etc/profile.d/locale.sh: . /etc/locale.conf
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch


    As you can see, however, this will print the entire matched line. What we are really interested in is the list of file names called, not the line that is calling them. You can get those with this, more complicated, regex:



    grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases
    /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    The -h flag suppresses the printing of the file names where a match was found, which grep does by default when told to search through multiple files. The -o means "only print the matching portion of the line". The extra stuff added to the regex are:





    • K : ignore anything matched up to this point. This is a PCRE trick that lets you use a complex regex to find your match but not include that matched portion when using grep's -o flag.


    On my system, the above command will return:



    $ grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases
    > /etc/bash.bashrc /etc/profile
    > /etc/profile.d/* /etc/environment 2> /dev/null
    /etc/bashrc
    /etc/bash_completion
    $HOME/scripts/git-prompt.sh
    $a*100/$c
    ")n"'
    /usr/share/bash-completion/bash_completion
    "$profile"
    /etc/bash.bashrc
    "$XDG_CONFIG_HOME/locale.conf"
    "$HOME/.config/locale.conf"
    /etc/locale.conf
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch


    Note that I happen to have a use of . followed by a space which is not used for sourcing but that's because I have an alias that is calling another language, not bash. That's what gives the weird $a*100/$c and ")n"' in the output above. But that can be ignored.



    Finally, here's how to put all of that together and search for a function name in all default files and all files your default files are sourcing:



    grep_function(){
    target="$@"
    files=( ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment)
    while IFS= read -r file; do
    files+=( "$file" )
    done < <(grep -hPo '(^|s)(.|source)s+KS+' "${files[@]}" 2>/dev/null)
    for file in "${files[@]}"; do
    ## The tilde of ~/ can break this
    file=$(sed 's|~/|'"$HOME"'/|g' <<<"$file")
    if [[ -e $file ]]; then
    grep -H "$target" -- "$file"
    fi
    done
    }


    Add those lines to your ~/.bashrc and you can then run (I am using fooBar as an example function name):



    grep_function fooBar


    For example, if I have this line in my ~/.bashrc:



    . ~/a


    And the file ~/a is:



    $ cat ~/a
    fooBar(){
    echo foo
    }


    I should find it with:



    $ grep_function fooBar
    /home/terdon/a:fooBar(){





    share|improve this answer




























    • Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

      – jarno
      May 26 at 13:40











    • @jarno and it is much, much simpler! :)

      – terdon
      May 26 at 14:09











    • Arrays support +=

      – D. Ben Knoble
      May 27 at 15:16











    • @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

      – terdon
      May 27 at 19:31






    • 1





      @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

      – terdon
      May 28 at 12:43
















    15














    This is actually more complicated than it appears at first. Which files are read by your shell depends on what type of shell you are currently running. Whether it is interactive or not, whether it is a login or a non-login shell and what combination of the above. To search through all the default files that can be read by the different shells, you can do (change $functionName to the actual name of the function you are looking for):



    grep "$functionName" ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login 
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    If that doesn't work, you may be calling a non-default file using . or its alias source. To find such cases, run:



    grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null


    That probably needs some explanation. The -P enables Perl Compatible Regular Expressions (PCRE) which let us use some fancier regex syntax. Specifically:





    • (^|s): match either the beginning of a line (^) or whitespace (s).


    • (.|source)s+ : match either a literal . character (.) or the word source, but only if they are followed by one or more whitespace characters.


    Here's what that gives me on my system:



    $ grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    > /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null
    /home/terdon/.bashrc: . /etc/bashrc
    /home/terdon/.bashrc: . /etc/bash_completion
    /home/terdon/.bashrc:. $HOME/scripts/git-prompt.sh
    /home/terdon/.bashrc:# echo -n "$n : "; grep "^CA" $n |perl -e 'my ($a,$c)=0; while(<>){$c++;next if /cellular_component_unknown/; next if /biological_process/; $a++} print "$a Classes of $c annotated (" . $a*100/$c . ")n"'
    /etc/bash.bashrc:[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
    /etc/profile: test -r "$profile" && . "$profile"
    /etc/profile: . /etc/bash.bashrc
    /etc/profile.d/locale.sh: . "$XDG_CONFIG_HOME/locale.conf"
    /etc/profile.d/locale.sh: . "$HOME/.config/locale.conf"
    /etc/profile.d/locale.sh: . /etc/locale.conf
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch


    As you can see, however, this will print the entire matched line. What we are really interested in is the list of file names called, not the line that is calling them. You can get those with this, more complicated, regex:



    grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases
    /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    The -h flag suppresses the printing of the file names where a match was found, which grep does by default when told to search through multiple files. The -o means "only print the matching portion of the line". The extra stuff added to the regex are:





    • K : ignore anything matched up to this point. This is a PCRE trick that lets you use a complex regex to find your match but not include that matched portion when using grep's -o flag.


    On my system, the above command will return:



    $ grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases
    > /etc/bash.bashrc /etc/profile
    > /etc/profile.d/* /etc/environment 2> /dev/null
    /etc/bashrc
    /etc/bash_completion
    $HOME/scripts/git-prompt.sh
    $a*100/$c
    ")n"'
    /usr/share/bash-completion/bash_completion
    "$profile"
    /etc/bash.bashrc
    "$XDG_CONFIG_HOME/locale.conf"
    "$HOME/.config/locale.conf"
    /etc/locale.conf
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch


    Note that I happen to have a use of . followed by a space which is not used for sourcing but that's because I have an alias that is calling another language, not bash. That's what gives the weird $a*100/$c and ")n"' in the output above. But that can be ignored.



    Finally, here's how to put all of that together and search for a function name in all default files and all files your default files are sourcing:



    grep_function(){
    target="$@"
    files=( ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment)
    while IFS= read -r file; do
    files+=( "$file" )
    done < <(grep -hPo '(^|s)(.|source)s+KS+' "${files[@]}" 2>/dev/null)
    for file in "${files[@]}"; do
    ## The tilde of ~/ can break this
    file=$(sed 's|~/|'"$HOME"'/|g' <<<"$file")
    if [[ -e $file ]]; then
    grep -H "$target" -- "$file"
    fi
    done
    }


    Add those lines to your ~/.bashrc and you can then run (I am using fooBar as an example function name):



    grep_function fooBar


    For example, if I have this line in my ~/.bashrc:



    . ~/a


    And the file ~/a is:



    $ cat ~/a
    fooBar(){
    echo foo
    }


    I should find it with:



    $ grep_function fooBar
    /home/terdon/a:fooBar(){





    share|improve this answer




























    • Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

      – jarno
      May 26 at 13:40











    • @jarno and it is much, much simpler! :)

      – terdon
      May 26 at 14:09











    • Arrays support +=

      – D. Ben Knoble
      May 27 at 15:16











    • @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

      – terdon
      May 27 at 19:31






    • 1





      @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

      – terdon
      May 28 at 12:43














    15












    15








    15







    This is actually more complicated than it appears at first. Which files are read by your shell depends on what type of shell you are currently running. Whether it is interactive or not, whether it is a login or a non-login shell and what combination of the above. To search through all the default files that can be read by the different shells, you can do (change $functionName to the actual name of the function you are looking for):



    grep "$functionName" ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login 
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    If that doesn't work, you may be calling a non-default file using . or its alias source. To find such cases, run:



    grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null


    That probably needs some explanation. The -P enables Perl Compatible Regular Expressions (PCRE) which let us use some fancier regex syntax. Specifically:





    • (^|s): match either the beginning of a line (^) or whitespace (s).


    • (.|source)s+ : match either a literal . character (.) or the word source, but only if they are followed by one or more whitespace characters.


    Here's what that gives me on my system:



    $ grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    > /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null
    /home/terdon/.bashrc: . /etc/bashrc
    /home/terdon/.bashrc: . /etc/bash_completion
    /home/terdon/.bashrc:. $HOME/scripts/git-prompt.sh
    /home/terdon/.bashrc:# echo -n "$n : "; grep "^CA" $n |perl -e 'my ($a,$c)=0; while(<>){$c++;next if /cellular_component_unknown/; next if /biological_process/; $a++} print "$a Classes of $c annotated (" . $a*100/$c . ")n"'
    /etc/bash.bashrc:[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
    /etc/profile: test -r "$profile" && . "$profile"
    /etc/profile: . /etc/bash.bashrc
    /etc/profile.d/locale.sh: . "$XDG_CONFIG_HOME/locale.conf"
    /etc/profile.d/locale.sh: . "$HOME/.config/locale.conf"
    /etc/profile.d/locale.sh: . /etc/locale.conf
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch


    As you can see, however, this will print the entire matched line. What we are really interested in is the list of file names called, not the line that is calling them. You can get those with this, more complicated, regex:



    grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases
    /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    The -h flag suppresses the printing of the file names where a match was found, which grep does by default when told to search through multiple files. The -o means "only print the matching portion of the line". The extra stuff added to the regex are:





    • K : ignore anything matched up to this point. This is a PCRE trick that lets you use a complex regex to find your match but not include that matched portion when using grep's -o flag.


    On my system, the above command will return:



    $ grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases
    > /etc/bash.bashrc /etc/profile
    > /etc/profile.d/* /etc/environment 2> /dev/null
    /etc/bashrc
    /etc/bash_completion
    $HOME/scripts/git-prompt.sh
    $a*100/$c
    ")n"'
    /usr/share/bash-completion/bash_completion
    "$profile"
    /etc/bash.bashrc
    "$XDG_CONFIG_HOME/locale.conf"
    "$HOME/.config/locale.conf"
    /etc/locale.conf
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch


    Note that I happen to have a use of . followed by a space which is not used for sourcing but that's because I have an alias that is calling another language, not bash. That's what gives the weird $a*100/$c and ")n"' in the output above. But that can be ignored.



    Finally, here's how to put all of that together and search for a function name in all default files and all files your default files are sourcing:



    grep_function(){
    target="$@"
    files=( ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment)
    while IFS= read -r file; do
    files+=( "$file" )
    done < <(grep -hPo '(^|s)(.|source)s+KS+' "${files[@]}" 2>/dev/null)
    for file in "${files[@]}"; do
    ## The tilde of ~/ can break this
    file=$(sed 's|~/|'"$HOME"'/|g' <<<"$file")
    if [[ -e $file ]]; then
    grep -H "$target" -- "$file"
    fi
    done
    }


    Add those lines to your ~/.bashrc and you can then run (I am using fooBar as an example function name):



    grep_function fooBar


    For example, if I have this line in my ~/.bashrc:



    . ~/a


    And the file ~/a is:



    $ cat ~/a
    fooBar(){
    echo foo
    }


    I should find it with:



    $ grep_function fooBar
    /home/terdon/a:fooBar(){





    share|improve this answer















    This is actually more complicated than it appears at first. Which files are read by your shell depends on what type of shell you are currently running. Whether it is interactive or not, whether it is a login or a non-login shell and what combination of the above. To search through all the default files that can be read by the different shells, you can do (change $functionName to the actual name of the function you are looking for):



    grep "$functionName" ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login 
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    If that doesn't work, you may be calling a non-default file using . or its alias source. To find such cases, run:



    grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null


    That probably needs some explanation. The -P enables Perl Compatible Regular Expressions (PCRE) which let us use some fancier regex syntax. Specifically:





    • (^|s): match either the beginning of a line (^) or whitespace (s).


    • (.|source)s+ : match either a literal . character (.) or the word source, but only if they are followed by one or more whitespace characters.


    Here's what that gives me on my system:



    $ grep -P '(^|s)(.|source)s+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases /etc/bash.bashrc
    > /etc/profile /etc/profile.d/* /etc/environment 2> /dev/null
    /home/terdon/.bashrc: . /etc/bashrc
    /home/terdon/.bashrc: . /etc/bash_completion
    /home/terdon/.bashrc:. $HOME/scripts/git-prompt.sh
    /home/terdon/.bashrc:# echo -n "$n : "; grep "^CA" $n |perl -e 'my ($a,$c)=0; while(<>){$c++;next if /cellular_component_unknown/; next if /biological_process/; $a++} print "$a Classes of $c annotated (" . $a*100/$c . ")n"'
    /etc/bash.bashrc:[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion
    /etc/profile: test -r "$profile" && . "$profile"
    /etc/profile: . /etc/bash.bashrc
    /etc/profile.d/locale.sh: . "$XDG_CONFIG_HOME/locale.conf"
    /etc/profile.d/locale.sh: . "$HOME/.config/locale.conf"
    /etc/profile.d/locale.sh: . /etc/locale.conf
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch
    /etc/profile.d/Z97-byobu.sh: . /usr/bin/byobu-launch


    As you can see, however, this will print the entire matched line. What we are really interested in is the list of file names called, not the line that is calling them. You can get those with this, more complicated, regex:



    grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    ~/.bash.login ~/.bash_aliases
    /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment 2> /dev/null


    The -h flag suppresses the printing of the file names where a match was found, which grep does by default when told to search through multiple files. The -o means "only print the matching portion of the line". The extra stuff added to the regex are:





    • K : ignore anything matched up to this point. This is a PCRE trick that lets you use a complex regex to find your match but not include that matched portion when using grep's -o flag.


    On my system, the above command will return:



    $ grep -hPo '(^|s)(.|source)s+KS+' ~/.bashrc ~/.profile ~/.bash_profile 
    > ~/.bash.login ~/.bash_aliases
    > /etc/bash.bashrc /etc/profile
    > /etc/profile.d/* /etc/environment 2> /dev/null
    /etc/bashrc
    /etc/bash_completion
    $HOME/scripts/git-prompt.sh
    $a*100/$c
    ")n"'
    /usr/share/bash-completion/bash_completion
    "$profile"
    /etc/bash.bashrc
    "$XDG_CONFIG_HOME/locale.conf"
    "$HOME/.config/locale.conf"
    /etc/locale.conf
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch
    /usr/bin/byobu-launch


    Note that I happen to have a use of . followed by a space which is not used for sourcing but that's because I have an alias that is calling another language, not bash. That's what gives the weird $a*100/$c and ")n"' in the output above. But that can be ignored.



    Finally, here's how to put all of that together and search for a function name in all default files and all files your default files are sourcing:



    grep_function(){
    target="$@"
    files=( ~/.bashrc ~/.profile ~/.bash_profile ~/.bash.login
    ~/.bash_aliases /etc/bash.bashrc /etc/profile
    /etc/profile.d/* /etc/environment)
    while IFS= read -r file; do
    files+=( "$file" )
    done < <(grep -hPo '(^|s)(.|source)s+KS+' "${files[@]}" 2>/dev/null)
    for file in "${files[@]}"; do
    ## The tilde of ~/ can break this
    file=$(sed 's|~/|'"$HOME"'/|g' <<<"$file")
    if [[ -e $file ]]; then
    grep -H "$target" -- "$file"
    fi
    done
    }


    Add those lines to your ~/.bashrc and you can then run (I am using fooBar as an example function name):



    grep_function fooBar


    For example, if I have this line in my ~/.bashrc:



    . ~/a


    And the file ~/a is:



    $ cat ~/a
    fooBar(){
    echo foo
    }


    I should find it with:



    $ grep_function fooBar
    /home/terdon/a:fooBar(){






    share|improve this answer














    share|improve this answer



    share|improve this answer








    edited May 28 at 11:20

























    answered May 26 at 11:11









    terdonterdon

    72.9k14 gold badges149 silver badges233 bronze badges




    72.9k14 gold badges149 silver badges233 bronze badges
















    • Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

      – jarno
      May 26 at 13:40











    • @jarno and it is much, much simpler! :)

      – terdon
      May 26 at 14:09











    • Arrays support +=

      – D. Ben Knoble
      May 27 at 15:16











    • @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

      – terdon
      May 27 at 19:31






    • 1





      @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

      – terdon
      May 28 at 12:43



















    • Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

      – jarno
      May 26 at 13:40











    • @jarno and it is much, much simpler! :)

      – terdon
      May 26 at 14:09











    • Arrays support +=

      – D. Ben Knoble
      May 27 at 15:16











    • @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

      – terdon
      May 27 at 19:31






    • 1





      @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

      – terdon
      May 28 at 12:43

















    Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

    – jarno
    May 26 at 13:40





    Your solution is a great educational scripting example, but I find bashity mcbashface's solution simpler.

    – jarno
    May 26 at 13:40













    @jarno and it is much, much simpler! :)

    – terdon
    May 26 at 14:09





    @jarno and it is much, much simpler! :)

    – terdon
    May 26 at 14:09













    Arrays support +=

    – D. Ben Knoble
    May 27 at 15:16





    Arrays support +=

    – D. Ben Knoble
    May 27 at 15:16













    @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

    – terdon
    May 27 at 19:31





    @D.BenKnoble they do? You mean other than array+="foo" appending the string foo to the 1st element of the array?

    – terdon
    May 27 at 19:31




    1




    1





    @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

    – terdon
    May 28 at 12:43





    @D.BenKnoble thanks! I didn't know bash arrays supported that notation!

    – terdon
    May 28 at 12:43











    2














    The usual per-user dotfile bash reads is ~/.bashrc. However, it may very well source other files, I for instance like to keep aliases and functions in separate files called ~/.bash_aliases and ~/.bash_functions, which makes finding them much easier. You can search the .bashrc for source commands with:



    grep -E '(^s*|s)(.|source)s' /home/USERNAME/.bashrc


    Once you have the list of user-created files you can search them and the user’s .bashrc with a single grep call, e.g. for function foo for my setup:



    grep foo /home/USERNAME/.bash{rc,_aliases,_functions}





    share|improve this answer
































      2














      The usual per-user dotfile bash reads is ~/.bashrc. However, it may very well source other files, I for instance like to keep aliases and functions in separate files called ~/.bash_aliases and ~/.bash_functions, which makes finding them much easier. You can search the .bashrc for source commands with:



      grep -E '(^s*|s)(.|source)s' /home/USERNAME/.bashrc


      Once you have the list of user-created files you can search them and the user’s .bashrc with a single grep call, e.g. for function foo for my setup:



      grep foo /home/USERNAME/.bash{rc,_aliases,_functions}





      share|improve this answer






























        2












        2








        2







        The usual per-user dotfile bash reads is ~/.bashrc. However, it may very well source other files, I for instance like to keep aliases and functions in separate files called ~/.bash_aliases and ~/.bash_functions, which makes finding them much easier. You can search the .bashrc for source commands with:



        grep -E '(^s*|s)(.|source)s' /home/USERNAME/.bashrc


        Once you have the list of user-created files you can search them and the user’s .bashrc with a single grep call, e.g. for function foo for my setup:



        grep foo /home/USERNAME/.bash{rc,_aliases,_functions}





        share|improve this answer















        The usual per-user dotfile bash reads is ~/.bashrc. However, it may very well source other files, I for instance like to keep aliases and functions in separate files called ~/.bash_aliases and ~/.bash_functions, which makes finding them much easier. You can search the .bashrc for source commands with:



        grep -E '(^s*|s)(.|source)s' /home/USERNAME/.bashrc


        Once you have the list of user-created files you can search them and the user’s .bashrc with a single grep call, e.g. for function foo for my setup:



        grep foo /home/USERNAME/.bash{rc,_aliases,_functions}






        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited May 26 at 15:49

























        answered May 26 at 10:08









        dessertdessert

        28.5k6 gold badges86 silver badges119 bronze badges




        28.5k6 gold badges86 silver badges119 bronze badges

































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Ask Ubuntu!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2faskubuntu.com%2fquestions%2f1146269%2fhow-can-i-find-where-certain-bash-function-is-defined%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Færeyskur hestur Heimild | Tengill | Tilvísanir | LeiðsagnarvalRossið - síða um færeyska hrossið á færeyskuGott ár hjá færeyska hestinum

            He _____ here since 1970 . Answer needed [closed]What does “since he was so high” mean?Meaning of “catch birds for”?How do I ensure “since” takes the meaning I want?“Who cares here” meaningWhat does “right round toward” mean?the time tense (had now been detected)What does the phrase “ring around the roses” mean here?Correct usage of “visited upon”Meaning of “foiled rail sabotage bid”It was the third time I had gone to Rome or It is the third time I had been to Rome

            Slayer Innehåll Historia | Stil, komposition och lyrik | Bandets betydelse och framgångar | Sidoprojekt och samarbeten | Kontroverser | Medlemmar | Utmärkelser och nomineringar | Turnéer och festivaler | Diskografi | Referenser | Externa länkar | Navigeringsmenywww.slayer.net”Metal Massacre vol. 1””Metal Massacre vol. 3””Metal Massacre Volume III””Show No Mercy””Haunting the Chapel””Live Undead””Hell Awaits””Reign in Blood””Reign in Blood””Gold & Platinum – Reign in Blood””Golden Gods Awards Winners”originalet”Kerrang! Hall Of Fame””Slayer Looks Back On 37-Year Career In New Video Series: Part Two””South of Heaven””Gold & Platinum – South of Heaven””Seasons in the Abyss””Gold & Platinum - Seasons in the Abyss””Divine Intervention””Divine Intervention - Release group by Slayer””Gold & Platinum - Divine Intervention””Live Intrusion””Undisputed Attitude””Abolish Government/Superficial Love””Release “Slatanic Slaughter: A Tribute to Slayer” by Various Artists””Diabolus in Musica””Soundtrack to the Apocalypse””God Hates Us All””Systematic - Relationships””War at the Warfield””Gold & Platinum - War at the Warfield””Soundtrack to the Apocalypse””Gold & Platinum - Still Reigning””Metallica, Slayer, Iron Mauden Among Winners At Metal Hammer Awards””Eternal Pyre””Eternal Pyre - Slayer release group””Eternal Pyre””Metal Storm Awards 2006””Kerrang! Hall Of Fame””Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Bullet-For My Valentine booed at Metal Hammer Golden Gods Awards””Unholy Aliance””The End Of Slayer?””Slayer: We Could Thrash Out Two More Albums If We're Fast Enough...””'The Unholy Alliance: Chapter III' UK Dates Added”originalet”Megadeth And Slayer To Co-Headline 'Canadian Carnage' Trek”originalet”World Painted Blood””Release “World Painted Blood” by Slayer””Metallica Heading To Cinemas””Slayer, Megadeth To Join Forces For 'European Carnage' Tour - Dec. 18, 2010”originalet”Slayer's Hanneman Contracts Acute Infection; Band To Bring In Guest Guitarist””Cannibal Corpse's Pat O'Brien Will Step In As Slayer's Guest Guitarist”originalet”Slayer’s Jeff Hanneman Dead at 49””Dave Lombardo Says He Made Only $67,000 In 2011 While Touring With Slayer””Slayer: We Do Not Agree With Dave Lombardo's Substance Or Timeline Of Events””Slayer Welcomes Drummer Paul Bostaph Back To The Fold””Slayer Hope to Unveil Never-Before-Heard Jeff Hanneman Material on Next Album””Slayer Debut New Song 'Implode' During Surprise Golden Gods Appearance””Release group Repentless by Slayer””Repentless - Slayer - Credits””Slayer””Metal Storm Awards 2015””Slayer - to release comic book "Repentless #1"””Slayer To Release 'Repentless' 6.66" Vinyl Box Set””BREAKING NEWS: Slayer Announce Farewell Tour””Slayer Recruit Lamb of God, Anthrax, Behemoth + Testament for Final Tour””Slayer lägger ner efter 37 år””Slayer Announces Second North American Leg Of 'Final' Tour””Final World Tour””Slayer Announces Final European Tour With Lamb of God, Anthrax And Obituary””Slayer To Tour Europe With Lamb of God, Anthrax And Obituary””Slayer To Play 'Last French Show Ever' At Next Year's Hellfst””Slayer's Final World Tour Will Extend Into 2019””Death Angel's Rob Cavestany On Slayer's 'Farewell' Tour: 'Some Of Us Could See This Coming'””Testament Has No Plans To Retire Anytime Soon, Says Chuck Billy””Anthrax's Scott Ian On Slayer's 'Farewell' Tour Plans: 'I Was Surprised And I Wasn't Surprised'””Slayer””Slayer's Morbid Schlock””Review/Rock; For Slayer, the Mania Is the Message””Slayer - Biography””Slayer - Reign In Blood”originalet”Dave Lombardo””An exclusive oral history of Slayer”originalet”Exclusive! Interview With Slayer Guitarist Jeff Hanneman”originalet”Thinking Out Loud: Slayer's Kerry King on hair metal, Satan and being polite””Slayer Lyrics””Slayer - Biography””Most influential artists for extreme metal music””Slayer - Reign in Blood””Slayer guitarist Jeff Hanneman dies aged 49””Slatanic Slaughter: A Tribute to Slayer””Gateway to Hell: A Tribute to Slayer””Covered In Blood””Slayer: The Origins of Thrash in San Francisco, CA.””Why They Rule - #6 Slayer”originalet”Guitar World's 100 Greatest Heavy Metal Guitarists Of All Time”originalet”The fans have spoken: Slayer comes out on top in readers' polls”originalet”Tribute to Jeff Hanneman (1964-2013)””Lamb Of God Frontman: We Sound Like A Slayer Rip-Off””BEHEMOTH Frontman Pays Tribute To SLAYER's JEFF HANNEMAN””Slayer, Hatebreed Doing Double Duty On This Year's Ozzfest””System of a Down””Lacuna Coil’s Andrea Ferro Talks Influences, Skateboarding, Band Origins + More””Slayer - Reign in Blood””Into The Lungs of Hell””Slayer rules - en utställning om fans””Slayer and Their Fans Slashed Through a No-Holds-Barred Night at Gas Monkey””Home””Slayer””Gold & Platinum - The Big 4 Live from Sofia, Bulgaria””Exclusive! Interview With Slayer Guitarist Kerry King””2008-02-23: Wiltern, Los Angeles, CA, USA””Slayer's Kerry King To Perform With Megadeth Tonight! - Oct. 21, 2010”originalet”Dave Lombardo - Biography”Slayer Case DismissedArkiveradUltimate Classic Rock: Slayer guitarist Jeff Hanneman dead at 49.”Slayer: "We could never do any thing like Some Kind Of Monster..."””Cannibal Corpse'S Pat O'Brien Will Step In As Slayer'S Guest Guitarist | The Official Slayer Site”originalet”Slayer Wins 'Best Metal' Grammy Award””Slayer Guitarist Jeff Hanneman Dies””Kerrang! Awards 2006 Blog: Kerrang! Hall Of Fame””Kerrang! Awards 2013: Kerrang! Legend”originalet”Metallica, Slayer, Iron Maien Among Winners At Metal Hammer Awards””Metal Hammer Golden Gods Awards””Bullet For My Valentine Booed At Metal Hammer Golden Gods Awards””Metal Storm Awards 2006””Metal Storm Awards 2015””Slayer's Concert History””Slayer - Relationships””Slayer - Releases”Slayers officiella webbplatsSlayer på MusicBrainzOfficiell webbplatsSlayerSlayerr1373445760000 0001 1540 47353068615-5086262726cb13906545x(data)6033143kn20030215029