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

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

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

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

是否有更方便的方法来查找当前定义的函数?

118188 次浏览

declare -F

函数的-f选项可以列出函数名和定义 declare内置命令(参见Bash内置命令)。declare-F选项 只列出函数名吗 (或者源文件和行号)

Bash Reference Manual . sh Bash Reference Manual

假设bash shell:

typeset -f

将列出函数。

typeset -F

将只列出函数名。

declare -F

会给你所有函数的名字

type function_name

会给你一个特定函数的源

排版已过时,请使用:

declare -f

declare -f function_name

type function_name

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

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

你可以使用compgen -A function只打印函数名:

$ compgen -A function
function1
function2
set | grep " ()"

你也可以使用fgrephgrep代替grep (hgrep是我个人最喜欢的,它是grep,但它简化了'grep-ped'结果

< em > hgrep < / em >可以在这里找到:ACME实验室hgrep

我不是这方面的专家,还在学习中,但在找到这个问题和它的答案之后,因为我想要同样的答案,我写了以下(基于"原型保罗的宣言"答案)给我最终什么我是之后:一个别名和函数的格式化列表:

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的回答之前,所以由此推断,我用适当的compgen命令替换了declarealias行,以得到:

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的其他选项)。我发现了一个很好的写作在这里,其中还包括一个链接到手册页(因为man compgen在某些情况下不起作用)。

Bash shell脚本特定的答案

(因为这个问题被标记为这个的副本)

如果你在你的shell中导出了函数,一个被调用的脚本将会看到它们。但幸运的是,他们被这样标记。

复制意大利面演示脚本

#!/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