在 Git 中为 Windows 设置后,什么可以重新初始化 COMP_WORDBREAKS?

What could reinitialize COMP_WORDBREAKS after I set it in Git for Windows?

我有一些使用 @ 的完成(如 @group),我希望将其从 COMP_WORDBREAKS 中删除,但我还没有理解什么是 恢复 @:我完全知道我们不应该修补COMP_WORDBREAKS并使用_get_comp_words_by_ref -n @,但Git上的版本Windows 2.28.0.windows.1 (+bash 4.4.23(1)-release) 与 Linux (Gentoo + Bash 5 + app-shells/bash-completion 2.11).

我试图将此添加到我的 ~/.bashrc for Windows,它来自 ~/.bash_profile,其输出显示在 PS1 提示符之前:

echo "COMP_WORDBREAKS before:"; declare -p COMP_WORDBREAKS
COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"
echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS
export COMP_WORDBREAKS

但是,这并没有按预期工作:如果我键入 declare -p COMP_WORDBREAKS 命令,@ 仍然存在:

COMP_WORDBREAKS before:
declare -- COMP_WORDBREAKS="
\"'><=;|&(:"
COMP_WORDBREAKS after:
declare -- COMP_WORDBREAKS="
\"'><=;|&(:"
# when I have first access to the TERM and that I can input the declare -p COMP_WORDBREAKS
$ declare -p COMP_WORDBREAKS
declare -- COMP_WORDBREAKS="@
\"'><=;|&(:"

此屏幕截图中也显示了这一点(我删除了识别部分,但这是与 Git 捆绑在一起用于 Windows 的“Git Bash”命令:

正如我们所见,某些东西(我想 bash)正在加回 @,但我找不到它在哪里或做什么。

它不恢复它。错误是你 set/print 值的方式。

COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"

你已经正确删除了 @,如果你只是做了一个

echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS

您会看到您所做的更改仍然存在。但是你决定把它写成

echo "COMP_WORDBREAKS after: $(declare -p COMP_WORDBREAKS)"

它创建一个子进程来执行 declare,并且由于您没有导出变量,子进程不知道您已经修改了它,并创建了自己的新版本。

问题是由于主机名完成 (shopt -p hostcomplete) 导致 bash 包含 @ 以完成(或拆分)主机,例如 user@hos

看到,在 Windows 下,完成度非常有限,我禁用了它:

  • 它使用(至少)/etc/hosts 作为来源来完成
  • Git for Windows /etc/hosts 没有任何主机。
  • MSYS2 /etc/hosts 似乎是 C:\Windows\System32\drivers\etc\hosts
  • 的副本

我不知道(这与我的问题无关)why/when /etc/hosts 是从 C:\Windows\System32\drivers\etc\hosts 复制的,但是这个完成对我来说毫无用处。