Bash 如何定义函数名的完成;模式;?

Bash 如何定义函数名的完成;模式;?,bash,bash-completion,Bash,Bash Completion,我有几个函数只与目录一起工作,所有函数名都遵循此模式(以\u dir结尾): 对于所有这些,我用以下方式定义完成: complete -A directory something_dir something_else_dir ... 是否可以自动定义所有函数的完成,以便每个以\u dir结尾的新函数只完成目录?使用compgen-A函数列出所有函数;然后grep-E.*\u dir$”过滤掉以\u dir结尾的函数 complete -A directory $(compgen -A fun

我有几个函数只与目录一起工作,所有函数名都遵循此模式(以\u dir结尾):

对于所有这些,我用以下方式定义完成:

complete -A directory something_dir something_else_dir ...


是否可以自动定义所有函数的完成,以便每个以\u dir结尾的新函数只完成目录?

使用
compgen-A函数
列出所有函数;然后
grep-E.*\u dir$”
过滤掉以
\u dir
结尾的函数

complete -A directory $(compgen -A function | grep -E '.*dir$')
这假设所有以
\u dir
结尾的函数名都没有特殊符号,如
*
和空格。根据该报告,情况应该始终如此

此命令仅为现有功能设置完成。要自动为您将在交互式会话中定义的功能添加完成,请将命令添加到
PROMPT\u command
,以便在每次提示时执行该命令

PROMPT_COMMAND="complete -A directory \$(compgen -A function | grep -E '.*dir$')"

这是个好主意。尽管如此,它不会自动为我添加的新函数工作。但我想这根本不可能。@mickp使用
提示符\u命令
,这是可能的。我编辑了我的答案。我的一个想法是定义一个函数(与
complete-F myfunc
一起应用),该函数将查看其第一个参数,以确定是否以
\u dir
结尾。但是,我不知道如何确保该函数应用于所有命令(不仅仅是没有预定义完成的命令),以及如果命令名不以
\u dir
结尾,如何返回预期完成。
PROMPT_COMMAND="complete -A directory \$(compgen -A function | grep -E '.*dir$')"