如何确保延迟加载的bash补全函数_scp为自定义my_scp命令生效
问题:让自定义脚本my_scp自动加载scp的补全函数
我编写了一个扩展scp功能的自定义脚本my_scp,语法与scp完全一致,希望复用scp的自动补全功能。按照之前的建议,我在.bash_aliases中添加了以下配置:
complete -o nospace -F _scp my_scp
但在终端输入my_scp <tab><tab>时,会出现错误:bash: completion: function _scp' not found。只有先输入scp 手动加载补全函数后,my_scp`的补全才能正常工作。
补充信息
- 输入
scp <tab><tab>前,执行complete -p my_scp scp的输出:
complete -o nospace -F _scp my_scp bash: complete: scp: no completion specification
- 输入
scp <tab><tab>后,执行complete -p my_scp scp的输出:
complete -o nospace -F _scp my_scp complete -o nospace -F _scp scp
- 输入
scp <tab><tab>前,执行type _scp显示bash: type: _scp: not found;输入后则能查看_scp函数的完整源码。
解决方案
方法1:提前预加载scp补全函数
直接在.bash_aliases或.bashrc中加载scp的补全定义文件,确保_scp函数在终端启动时就可用:
# 加载scp的补全定义文件(路径可能因系统而异) source /usr/share/bash-completion/completions/scp # 为my_scp绑定scp的补全逻辑 complete -o nospace -F _scp my_scp
如果上述路径不存在,可以通过以下命令查找正确的scp补全文件路径:
find / -name "scp" -path "*bash-completion*" 2>/dev/null
方法2:延迟加载补全函数(推荐)
如果不想提前加载所有补全资源,可以编写一个临时补全函数,在第一次触发my_scp补全时自动加载_scp函数并替换补全规则:
_my_scp_completion() { # 使用bash-completion的工具函数加载scp的补全定义 _completion_loader scp # 移除当前临时补全规则 complete -r my_scp # 为my_scp绑定正式的scp补全逻辑 complete -o nospace -F _scp my_scp # 处理当前的补全请求 _scp "$@" } # 先为my_scp绑定临时补全函数 complete -o nospace -F _my_scp_completion my_scp
这个方法的优势是不会在终端启动时额外加载资源,只有当第一次使用my_scp的补全功能时,才会触发_scp函数的加载,之后就会直接使用正式的补全规则。
内容的提问来源于stack exchange,提问作者Boris Bukh
相关产品推荐
相关产品推荐

