如何列出shell中定义的函数?

时间:2010-12-17 14:24:53

标签: bash shell function unix

我可以输入别名来显示所有别名的列表。

但是对于函数,我所能做的就是grep my .bash_profile

只获取该文件中的那些,而不是在子文件中定义的或动态的。

有没有更方便的方法来找出当前定义的功能?

8 个答案:

答案 0 :(得分:227)

declare -F

  

可以使用-f选项列出函数名称和定义   declare内置命令(参见Bash Builtins)。 -F的{​​{1}}选项   将仅列出函数名称   (以及可选的源文件和行号)。

Bash Reference Manual

答案 1 :(得分:77)

假设bash shell:

typeset -f

将列出功能。

typeset -F

将仅列出函数名称。

答案 2 :(得分:57)

declare -F

将为您提供所有功能的名称

type function_name

将为您提供特定功能的来源

答案 3 :(得分:46)

declare -F实际上打印声明命令而不仅仅是函数名称:

$ declare -F
declare -f function1
declare -f function2

您可以使用compgen -A function仅打印功能名称:

$ compgen -A function
function1
function2

答案 4 :(得分:28)

排版已过时,请使用:

declare -f

declare -f function_name

type function_name

答案 5 :(得分:2)

set | grep " ()"

代替 grep ,你也可以使用 fgrep hgrep (hgrep是我个人最喜欢的,它的grep,但它可以让人感到高兴。

hgrep 可在此处找到:ACME Labs hgrep

答案 6 :(得分:2)

我不是这个专家,仍然在学习,但是在找到了这个问题及其答案之后,因为我想要同样的答案,我写了以下内容(基于“ The Archetypal Paul's declare”的答案),最终给了我什么之后:别名和函数的格式化列表:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    declare -F | awk {'print $3'}
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    alias | awk {'print $2'} | awk -F= {'print $1'}
    echo
    echo -e "\033[0m"
}

那是在我看到Lri's answer之前,因此推断出来,我用适当的declare命令代替了aliascompgen行,以获得:

function functionaliaslist() {
    echo
    echo -e "\033[1;4;32m""Functions:""\033[0;34m"
    compgen -A function
    echo
    echo -e "\033[1;4;32m""Aliases:""\033[0;34m"
    compgen -A alias
    echo
    echo -e "\033[0m"
}

我想要的东西请了一下。分享以防他人使用。

compgen -A [action]有许多其他“操作”(当然还有compgen的其他选项)。我找到了不错的文章here,其中还包含指向手册页的链接(因为man compgen在某些情况下不起作用)。

答案 7 :(得分:0)

Bash shell脚本特定的答案

(因为this question被标记为与此副本的副本)

如果在外壳程序中导出了函数,则调用脚本将看到它们。但幸运的是,它们被标记为这样。

复制粘贴演示脚本

#!/bin/bash
foo(){ :;}; bar(){ :;}; baz(){ :;}; export -f foo bar

export -pf

bash -c $'spam(){ :;}; \
echo "RAW:"; \
declare -pF; \
echo "FILTERED:"; \
declare -pF | awk \'$2 !~ /x/{print$3}\''

Bash成绩单

/tmp $ foo(){ :;}; bar(){ :;}; baz(){ :;}; export -f foo bar

/tmp $ export -pf
bar ()
{
    :
}
declare -fx bar
foo ()
{
    :
}
declare -fx foo

/tmp $ bash -c $'spam(){ :;}; echo "RAW:"; declare -pF; echo "FILTERED:"; declare -pF | awk \'$2 !~ /x/{print$3}\''
RAW:
declare -fx bar
declare -fx foo
declare -f spam
FILTERED:
spam