我可以输入alias来显示所有别名的列表。
但是对于函数,我所能做的就是grep .bash_profile。
它只获取该文件中的那些,而不是在子文件或动态定义的那些。
是否有更方便的方法来查找当前定义的函数?
我可以输入alias来显示所有别名的列表。
但是对于函数,我所能做的就是grep .bash_profile。
它只获取该文件中的那些,而不是在子文件或动态定义的那些。
是否有更方便的方法来查找当前定义的函数?
当前回答
declare -F实际上打印声明命令,而不仅仅是函数名:
$ declare -F
declare -f function1
declare -f function2
你可以使用compgen -A函数只打印函数名:
$ compgen -A function
function1
function2
其他回答
我不是这方面的专家,仍在学习,但在找到这个问题及其答案后,因为我想要同样的答案,我写了以下内容(基于“原型保罗的声明”答案),最终给了我我想要的:一个别名和函数的格式化列表:
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命令代替声明和别名行,以获得:
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
declare -F实际上打印声明命令,而不仅仅是函数名:
$ declare -F
declare -f function1
declare -f function2
你可以使用compgen -A函数只打印函数名:
$ compgen -A function
function1
function2
declare -F
会给你所有函数的名字
type function_name
会给你一个特定函数的源
set | grep " ()"
你也可以用fgrep或hgrep代替grep (hgrep是我个人最喜欢的,它是grep,但它简化了“grep-ped”结果。
hgrep可以在这里找到:ACME实验室hgrep