问题描述
我已经完成了一些使用@
的操作(如@group
),我希望将其从COMP_WORDBREAKS
中删除,但是我还不了解什么是还原 @
:我完全知道我们不应该修改COMP_WORDBREAKS
并使用_get_comp_words_by_ref -n @
,而是Git Windows 2.28.0.windows.1(+ bash)上的版本4.4.23(1)-发行版)与Linux上的版本(Gentoo + Bash 5 + app-shells / bash-completion 2.11)不同。
我试图将其添加到Windows的~/.bashrc
中,该窗口由~/.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="@
\"'><=;|&(:"
此屏幕快照中还显示了以下内容(我删除了识别部分,但这是Windows附带的“ Git Bash”命令):
如我们所见,某项(我想是bash
)正在加回@
,但我找不到在哪里或做什么。
- 我已签入Bash manual,但看不到它将恢复
@
的位置吗? - 我还检查了可以修改
COMP_WORDBREAKS
的文件,但没有发现任何结论性文件。
解决方法
问题是由于主机名完成(shopt -p hostcomplete
)导致bash包含@
才能完成(或拆分)主机,例如user@hos
。
看到在Windows下,完成功能非常有限,因此我将其禁用了:
- 它至少使用
/etc/hosts
作为来源 - 用于Windows
/etc/hosts
的Git没有任何主机。 - MSYS2
/etc/hosts
似乎是C:\Windows\System32\drivers\etc\hosts
的副本
我不知道(与我的问题无关)为什么/何时从/etc/hosts
复制C:\Windows\System32\drivers\etc\hosts
,但是对于我来说,这种完成是毫无用处的。
它不会还原它。错误是您设置/打印值的方式。
在
COMP_WORDBREAKS="${COMP_WORDBREAKS//@/}"
您已正确删除了@
,如果您只是做了一个
echo "COMP_WORDBREAKS after:"; declare -p COMP_WORDBREAKS
您会看到所做的更改仍然存在。但是您决定将其写为
echo "COMP_WORDBREAKS after: $(declare -p COMP_WORDBREAKS)"
这将创建一个用于执行declare
的子进程,并且由于您没有导出变量,因此该子进程不知道您已对其进行了修改,并创建了自己的全新版本。