如何列出外壳程序中定义的功能?


221

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

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

这样只会得到该文件中的文件,而不是在子文件中定义的文件或动态获得的文件。

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



2
@AlastairIrvine感谢您的重复提名;但是,我反过来解决了。这个问题有更多的看法和支持,还有更多的答案可供选择;而您提名的副本上的公认答案显然是晦涩的,并且可以说是错误的。
人间

Answers:


271

declare -F

函数名称和定义可能与内置命令的-f选项一起 列出declare(请参阅Bash内置文件)。该-F选项declare 将列出函数名只(以及可选的源文件和行号)。

Bash参考手册


1
在GNU bash 4.3.46(1)-发行版(x86_64-pc-linux-gnu)中-F列出名称/ -f列出整个功能
ceph3us 2016年

5
要获取“可选”源文件/行号,您必须启用extdebug(shopt -s extdebug)并为declare -F命令提供一个或多个函数名。即使启用了extdebug,IOW declare -F不会提供文件名/行号,这从文档中看不出来,也不是特别直观的IMO。
罗恩·伯克

请参阅下面的@ user495470答案,以获得更好的解决方案。
starbeamrainbowlabs

82

假设bash shell:

typeset -f

将列出功能。

typeset -F

将仅列出函数名称。


8
我的bash v4.1.17(9)版本说:Obsolete. See `help declare'.
kevinarpe 2014年

5
很高兴知道它是同义词。
2015年


51

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

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

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

$ compgen -A function
function1
function2

6
compgen -A function正是我想要的。

2
真好!在我的情况下,我也希望使用别名...您可以使用compgen -a -A function
Matt Byrne

+1,而我仅使用以下内容输出了我的个人功能(在Linux Debian上):compgen -A function | grep "^[a-z]\+" | grep -vE "^dequote|^quote|^in_array"
Dmytro Dzyubak

30

排版已过时,请使用:

declare -f

要么

declare -f function_name

要么

type function_name

4
set | grep " ()"

您也可以使用fgrep代替grephgrep (hgrep是我个人最喜欢的,它是grep,但可以显示“ grep-ped”结果。

hgrep可以在这里找到: ACME Labs hgrep


1
这将列出函数以及具有值()的变量
Alois Mahdal

2
@AloisMahdal这是一个可行的方法:set | grep " () $" | cut -d' ' -f1。但是,与其他答案相比,它过于复杂。
wjandrea '16

5
grep并不是一个好的解决方案,匹配函数定义的字符串将导致误报。@wjandrea仍然可以被多行字符串捕获,正则表达式也可以被捕获。
马特

1

我不是这个专家,仍然在学习,但是在找到了这个问题及其答案之后,因为我想要同样的答案,我写了以下内容(基于“ 原型保罗的声明 ”答案),最终给了我我所追求的:别名和函数的格式列表:

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的答案之前,因此从中推断出来,我改为使用适当的命令替换declareand 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(当然还有其他选择)。我在这里找到了不错的文章,其中也包含指向手册页的链接(因为man compgen在某些情况下不起作用)。

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.