You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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系统默认自带的,不是我手动添加的。我检查了相关配置文件,发现了一些细节:

  1. /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
  1. /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
  1. 我对比了主shell和子shell的启动参数,看起来完全一致:
# 主shell
$ echo $-
himBHs

# 子shell
$ bash
$ echo $-
himBHs
  1. bash命令也没有被别名替换:
$ type bash
bash is /usr/bin/bash

希望有经验的朋友能帮我分析一下问题出在哪,谢谢大家!

备注:内容来源于stack exchange,提问作者PieterV

火山引擎 最新活动