如何解决 git 在子 shell 中无法工作的 bash 完成问题

如何解决 git 在子 shell 中无法工作的 bash 完成问题

当我启动第一个 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

相关内容