Ubuntu 18+Bash 4.4下more命令环境变量自动补全异常求助
解决Bash中
more命令环境变量补全时添加转义符的问题 这个问题的根源在于Bash命令补全的规则差异:more的默认补全脚本没有像ls、less或cd那样优先展开环境变量,反而将$符号当成普通字符进行转义,导致shell无法解析$TEST_DIR为实际路径,最终报错找不到文件。
为什么会出现这个现象?
Bash的命令补全功能由/usr/share/bash-completion/completions/目录下的脚本控制。less、ls等命令的补全脚本使用了_filedir这类标准函数,会自动展开环境变量、波浪号等特殊符号;而more的默认补全规则可能更保守,直接将输入的字符串(包括$)作为字面量处理,所以补全时会添加\转义$,导致$TEST_DIR无法被解析为实际路径。
解决方案:修改more的补全规则
你只需要在~/.bashrc文件中添加一行配置,让more复用_filedir补全函数(和less使用的一样),就能解决这个问题:
complete -F _filedir more
添加完成后,执行source ~/.bashrc让配置立即生效,或者重新登录Shell。之后再尝试补全more $TEST_DIR/acc<Tab>,就会像less一样正确展开环境变量,不会再添加转义符了。
哪些命令可能存在同样的问题?
通常,那些默认补全规则没有使用_filedir或类似展开特殊符号的命令都可能出现这个问题,比如:
nl:行号查看命令od:二进制文件查看命令- 一些自定义的脚本或小众命令,如果它们的补全脚本没有处理环境变量展开逻辑
你可以通过查看/usr/share/bash-completion/completions/目录下对应的补全脚本,判断是否存在类似问题;如果有,同样可以用complete -F _filedir <命令名>的方式修复。
内容的提问来源于stack exchange,提问作者Yehudit Hasin
相关产品推荐
相关产品推荐

