Bash自定义bk备份函数Tab补全时意外生成help/topics备份文件问题
问题原因
Bash 自带的 bash-completion 通用补全框架存在默认探测逻辑:当你没有为自定义的 bk 命令编写专属补全规则时,补全模块会在你按下bk help、bk topics 这类命令,探测命令是否支持内置帮助输出、是否有可提取的补全选项参数。
由于你编写的 bk 函数没有做任何参数合法性校验,只要传入参数就会默认当做要备份的文件名处理,因此补全框架后台执行的 bk help topics 就会把 help、topics 当做待备份文件,生成对应的冗余备份文件。
解决方法
- 方案1:给函数增加文件存在性校验
仅当传入的参数是真实存在的文件/目录时,才执行备份操作,不存在的参数直接跳过:export tmfmt=%Y.%m.%d:%H:%M:%S #+%Z function bk() { local tmstp=`date +$tmfmt` set "$@" while (("$#")) do # 新增校验:判断文件是否存在,不存在直接跳过 if [ ! -e "$1" ]; then shift continue fi cp "$1" ".$1.backup.$tmstp.${1##*.}" ln -sfT ".$1.backup.$tmstp.${1##*.}" ".$1.backup.${1##*.}" shift done } - 方案2:为bk命令注册专属补全规则
直接告诉补全框架bk命令仅需要补全文件名,不需要走通用探测逻辑,在~/.bashrc中加入以下配置即可:# 仅补全普通文件,不需要其他探测逻辑 complete -f bk - 方案3:适配补全框架的探测参数
在函数开头直接拦截补全框架常用的探测参数,收到这类参数时直接返回不执行备份逻辑:export tmfmt=%Y.%m.%d:%H:%M:%S #+%Z function bk() { # 新增拦截逻辑:补全探测参数直接返回 if [[ "$1" == "help" || "$1" == "topics" ]]; then return 0 fi local tmstp=`date +$tmfmt` set "$@" while (("$#")) do cp "$1" ".$1.backup.$tmstp.${1##*.}" ln -sfT ".$1.backup.$tmstp.${1##*.}" ".$1.backup.${1##*.}" shift done }
内容的提问来源于stack exchange,提问作者rikuri
相关产品推荐
相关产品推荐

