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

Dov*_*Dov 202 unix bash shell function

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

但是对于功能,我所能做的就是贪图我.bash_profile.

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

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

The*_*aul 249

declare -F

可以使用builtin命令的-f选项 列出函数名称和定义declare(请参阅Bash Builtins).该-F选项declare 仅列出函数名称(以及可选的源文件和行号).

Bash参考手册

  • 要获得“可选的”源文件/行号,似乎必须启用extdebug(`shopt -s extdebug`),并向`declare -F`命令提供一个或多个函数名。IOW,即使启用了extdebug,`declare -F`也不会**提供文件名/行号,这在文档中并不清楚,IMO也不是特别直观。 (4认同)
  • 在 GNU bash 4.3.46(1)-release (x86_64-pc-linux-gnu) -F 列出名称 / -f 列出整个函数 (2认同)

Ran*_*ohn 80

假设bash shell:

typeset -f
Run Code Online (Sandbox Code Playgroud)

将列出功能.

typeset -F
Run Code Online (Sandbox Code Playgroud)

将仅列出函数名称.

  • 我的bash v4.1.17(9) - 释放说:`已过时.见\`help declare' (7认同)
  • 知道它是一个同义词仍然很好. (5认同)

Joh*_*den 59

declare -F
Run Code Online (Sandbox Code Playgroud)

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

type function_name
Run Code Online (Sandbox Code Playgroud)

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

  • 或仅对源使用clarify -f(小写) (2认同)
  • +1 表示“type”,因为这也适用于别名(无需知道您的命令是其中之一)。 (2认同)

Lri*_*Lri 48

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

$ declare -F
declare -f function1
declare -f function2
Run Code Online (Sandbox Code Playgroud)

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

$ compgen -A function
function1
function2
Run Code Online (Sandbox Code Playgroud)

  • `compgen -A function`就是我想要的. (5认同)
  • +1 并且我仅使用以下内容来输出我的个人功能(在 Linux Debian 上):`compgen -A function | grep "^[az]\+" | grep -vE "^dequote|^quote|^in_array"` (3认同)
  • 太好了!在我的情况下我也想要别名......你可以使用`compgen -a -A function`获得别名和函数 (2认同)

小智 29

排版已经过时,请使用:

declare -f
Run Code Online (Sandbox Code Playgroud)

要么

declare -f function_name
Run Code Online (Sandbox Code Playgroud)

要么

type function_name
Run Code Online (Sandbox Code Playgroud)


Dav*_*idT 8

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

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"
}
Run Code Online (Sandbox Code Playgroud)

那是在我看到Lri 的答案之前,因此据此推断,我用适当的命令替换declarealiascompgen,以获得:

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"
}
Run Code Online (Sandbox Code Playgroud)

为我想要的东西提供了一种享受。分享以防对其他人有帮助。

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


小智 6

set | grep " ()"
Run Code Online (Sandbox Code Playgroud)

您还可以使用fgrephgrep代替grep (hgrep 是我个人的最爱,它是 grep 但它可以简化“grep-ped”的结果。

hgrep可以在这里找到: ACME 实验室 hgrep

  • `grep` 不是一个好的解决方案,匹配函数定义的字符串会导致误报。@wjandrea 仍然可以被多行字符串捕获,任何正则表达式也是如此。 (5认同)
  • @AloisMahdal 这是一个有效的方法:`set | grep " () $" | 剪切 -d' ' -f1`。但与其他答案相比,它过于复杂。 (2认同)