Bash子shell中Tab自动补全功能失效的解决方法求助
Bash子shell中Tab自动补全功能失效的解决方法求助
大家好,我最近碰到了一个奇怪的问题:当我在命令行里调用bash启动一个子shell后,Tab自动补全功能完全失效了!在原来的主shell里执行complete命令,能看到一堆系统默认的补全配置,但新启动的子shell里执行complete,输出居然是空的。
给大家具体看一下场景:
主shell中的情况
$ complete [...] complete -F _apport-collect apport-collect complete -F _filedir_xspec vim complete -o dirnames -o filenames -F _apport-bug ubuntu-bug complete -F _known_hosts ftp complete -F _longopt units complete -F _longopt uname complete -F _service /etc/init.d/network-manager complete -F _longopt touch complete -F _longopt ldd complete -F _command then complete -F _known_hosts rlogin complete -F _service /etc/init.d/sddm complete -F _service /etc/init.d/lvm2-lvmpolld complete -F _command command complete -F _longopt sha384sum complete -F _known_hosts fping6 complete -F _longopt rm complete -F _service /etc/init.d/cryptdisks complete -F _service /etc/init.d/binfmt-support
启动子shell后的情况
$ bash $ complete $
我想请教一下,怎么才能让子shell也正常使用Tab补全呢?是不是我的profile或者bashrc配置里漏了什么东西?
补充信息
这些补全配置是Ubuntu系统默认自带的,不是我手动添加的。我检查了相关配置文件,发现了一些细节:
/etc/bash.bashrc里有提到补全的配置段,但默认是被注释掉的(不是我修改的):
# enable bash completion in interactive shells #if ! shopt -oq posix; then # if [ -f /usr/share/bash-completion/bash_completion ]; then # . /usr/share/bash-completion/bash_completion # elif [ -f /etc/bash_completion ]; then # . /etc/bash_completion # fi #fi
/etc/profile会执行/etc/profile.d目录下的所有脚本,其中有一个专门负责加载补全的脚本,内容如下:
# shellcheck shell=sh disable=SC1091,SC2039,SC2166 # Check for interactive bash and that we haven't already been sourced. if [ "x${BASH_VERSION-}" != x -a "x${PS1-}" != x -a "x${BASH_COMPLETION_VERSINFO-}" = x ]; then # Check for recent enough version of bash. if [ "${BASH_VERSINFO[0]}" -gt 4 ] || \ [ "${BASH_VERSINFO[0]}" -eq 4 -a "${BASH_VERSINFO[1]}" -ge 1 ]; then [ -r "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" ] && \ . "${XDG_CONFIG_HOME:-$HOME/.config}/bash_completion" if shopt -q progcomp && [ -r /usr/share/bash-completion/bash_completion ]; then # Source completion code. . /usr/share/bash-completion/bash_completion fi fi fi
- 我对比了主shell和子shell的启动参数,看起来完全一致:
# 主shell $ echo $- himBHs # 子shell $ bash $ echo $- himBHs
bash命令也没有被别名替换:
$ type bash bash is /usr/bin/bash
希望有经验的朋友能帮我分析一下问题出在哪,谢谢大家!
备注:内容来源于stack exchange,提问作者PieterV




