加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何使用bash完成 – 即时定义的函数?

发布时间:2020-12-15 20:59:46 所属栏目:安全 来源:网络整理
导读:我尝试为别名添加完成:alias m =’man’. 所以,我在我的.bashrc中添加了完整的-F _man m. 问题是用于完成的函数_man不是在bash会话开始时定义的,而是在$man命令上执行第一个tab竞争时定义的. 所以: $complete -p | grep _man可以不返回任何内容,也可以返回
我尝试为别名添加完成:alias m =’man’.
所以,我在我的.bashrc中添加了完整的-F _man m.

问题是用于完成的函数_man不是在bash会话开始时定义的,而是在$man命令上执行第一个tab竞争时定义的.
所以:
$complete -p | grep _man可以不返回任何内容,也可以返回:

complete -F _man man
complete -F _man apropos
complete -F _man whatis

因此,当我尝试使用$m命令完成选项卡时,我可以得到:

$m -bash: completing : function ? _man ? not found
$m

我对函数_aptitude和_apt-get也有同样的问题

我想要的是,使用我的.bashrc在bash启动时强制创建函数_man,_aptitude,_apt-get.
也许有可能使用compgen builtin.

我的bash版本是:
GNU bash,版本4.2.45(1)-release(x86_64-pc-linux-gnu)

谢谢阅读.

编辑:事实上,类似的问题已经存在并得到了回答:
– bash-completion – completion function defined the first time a command is invoked –

解决方法

你有.bashrc:

alias m='man'
complete -F _man m

只需添加:

_completion_loader man

然后你在$m的完成工作将很好,即使没有在$man上执行制表完成.

_completion_loader可能未在您的发行版中定义.这是在Ubuntu 14.04的.bashrc中找到的代码的副本:

_completion_loader () 
{ 
    local compfile=./completions;
    [[ $BASH_SOURCE == */* ]] && compfile="${BASH_SOURCE%/*}/completions";
    compfile+="/${1##*/}";
    [[ -f "$compfile" ]] && . "$compfile" &> /dev/null && return 124;
    complete -F _minimal "$1" && return 124
}

实际上,为了避免两次生成_man函数,您还应该更改该行完成-F _man m to完成-F _man man m.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读