当我启动第一个 bash shell 时,git 的补全工作正常 ( git rest<TAB>
-> git restore
)。在第一个 shell 中打开第二个 shell 后,制表符补全不再适用于 git,但常规文件补全仍然有效。
两个 shell 中的输出completion
相同(排序顺序除外)。
$ echo $0
-bash
$ complete git
$ git rest<TAB> # <--- works
$ cd<TAB> # <--- works
$ bash
$ echo $0
bash
$ complete git
$ git rest<TAB> # <--- does NOT work
$ cd<TAB> # <--- works
我如何找出哪里出了问题?
答案1
这可能是因为子 shell 不是登录 shell。我从您发布的输出中注意到,第一个 shell 是登录 shell(因为它的第一个字符是“-”),而子 shell 不是登录 shell。
在我的 bash 安装中,/etc/profile
脚本来源了 下的所有脚本/etc/profile.d/
,其中包括/etc/profile.d/bash_completion.sh
.但是,bash 不会读取/etc/profile
非登录 shell。我确认,如果我启动一个非登录子 shell(仅使用bash
),那么 git 完成功能将不起作用,但如果我然后. /etc/profile.d/bash_completion.sh
它们就会开始工作。
更通用的解决方法可能是使用 启动子 shell 作为登录 shell bash --login
。