允许我在键入 scp 命令时对远程文件进行制表符补全的神奇之处是什么?

Ste*_* Lu 16 shell zsh autocomplete

大概这是我在 oh-my-zsh 设置中启用的某个插件提供的功能(我已经使用 zsh 很多年了)。

我注意到自从我将我的公钥添加到服务器(现在我可以在不输入密码的情况下通过 SSH 连接到服务器),当我scp在我的 shell 中编写一个命令时,我实际上能够完成远程文件路径!

例如

$ diff <(scp Remoteuser@remote.domain.net:/var/www/html/
Run Code Online (Sandbox Code Playgroud)

我点击了标签,它就起作用了!(至于我试图用命令本身完成什么,我将使用scp“复制”到标准输出,并将其作为文件提供给差异。这样我可以看到我在之前部署到服务器的确切更改运行rsync)

我很好奇是什么部分使这项工作如此顺利。它是否内置于与 z shell 集成的 scp 中?或者是其他东西?

Ste*_* Lu 16

哦,我找到了一个解释

引用相关部分:

zsh shell 带有(不止一个)强大的功能,例如远程制表符补全。例如,如果您想通过 scp 复制文件,只需在远程主机上的文件名的任何部分点击 Tab。zsh 能够在后台建立一个 ssh 会话,并为您获取相关信息,因此您可以通过远程文件进行 tabcomplete。

这篇文章继续展示了一些zstyle实现完成的声明,但我强烈建议使用 zsh 包,比如前面提到的oh-my-zsh来让 OSS 社区为你维护这些东西。

一些看似相关的东西,如在我的系统上的 .oh-my-zsh 目录中看到的:

$ ack scp 
plugins/common-aliases/common-aliases.plugin.zsh
85:zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%
[# ]*}//,/ })'

<...>
Run Code Online (Sandbox Code Playgroud)

  • @shivams 对我来说,它总是在 bash 中有效——有一天我只是本能地在 scp 命令中点击了“tab”,并且很惊讶地看到它自动完成!谷歌搜索,如果你还没有安装 bash-completion 包,看起来好像你需要安装它。[这个 unix.se 问题是相关的。](http://unix.stackexchange.com/questions/33336/how-to-enable-autocompletion-for-remote-paths-when-using-scp) (7认同)