在 中zsh
,ssh 和 scp 使用来自 的主机完成/etc/hosts
。但是,即使我使用大写字母并且当我明显指的是文件而不是主机时,它们也会尝试匹配主机名:
$ scp -rp F<tab>
FOO.txt foo.mydomain.com
我想禁用此功能。我已经更改了以下行/usr/share/zsh/functions/Completion/Unix/_ssh
compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
到
compadd "$@" $config_hosts
现在,当我开始输入 ssh 命令并使用选项卡自动完成主机名时,ssh foo<tab>
我收到错误:
_all_labels:39: command not found: -J
这是什么意思,我该如何解决它?
第二个问题是,在对 Unix/_ssh 进行更改后,我无法重新编译完成文件:
zcompile Unix/ Unix.zwc
zcompile: can't open file: Unix.zwc
这是我按Ctrl+ X+时得到的结果?:
$ scp -rp TE
Trace output left in /tmp/zsh10048scp3 (up-history to view)
TESTING.txt
testing testing.mydomain.com
其中 TESTING.txt 是文件, 和testing
是testing.mydomain.com
主机名
更新:
我注意到,_all_labels:39
只有主机出现上述错误,其中包含ProxyCommand
,~/.ssh/config
即:
Host testing testing.mydomain.com
Hostname testing.mydomain.com
User root
PubkeyAuthentication yes
StrictHostKeyChecking yes
UserKnownHostsFile ~/.ssh/known_hosts
ProxyCommand ssh server2.mydomain.com nc %h %p
答案1
请确保您没有删除上一行中的“\”/usr/share/zsh/functions/Completion/Unix/_ssh,同时进行更改:
_wanted hosts expl 'remote host name' \
compadd -M 'm:{a-zA-Z}={A-Za-z} r:|.=* r:|=*' "$@" $config_hosts
我这样做了(删除了连续字符“\”通缉行),并得到与您完全相同的错误:
_all_labels:39: command not found: -J
另一种可能性是您可能不小心在“\”后面添加了一些额外的空格,从而禁用了它。
关于您问题的第二部分,我相信使用的正确语法是:
zcompile Unix.zwc Unix/*
(将 Unix/ 中的所有内容编译为 Unix.zwc)