我正在使用sshpass
这样的命令:
sshpass -p 'my_password' ssh user@server
根据手册页,完整的语法是
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments
目前,zsh 没有任何补全规则sshpass
。如何创建简单的完成规则,以便一旦到达“命令”和“参数”,命令的 ssh 就完成,并且 user@host 的完成与标准 ssh 的完成相同?
答案1
您可以从具有类似语法的命令中获取灵感,例如sudo
它还接受选项,后跟命令名称及其选项。也可以看看自定义命令的动态 zsh 自动完成有关编写 zsh 补全的介绍。
将以下代码放入_sshpass
名为$fpath
. (看如何正确地使自定义 zsh 完成“正常工作”?有关 zsh 如何选择补全功能的更多详细信息。)
#compdef sshpass
_sshpass () {
local context state line
typeset -A opt_args
_arguments \
'(-d -e -f -p)-d+[read password from file descriptor]:file descriptor:_file_descriptors' \
'(-d -e -f -p)-e[take password from $SSHPASS]' \
'(-d -e -f -p)-f+[read password from file]:file:_files' \
'(-d -e -f -p)-p+[actual password]::' \
'(-)1:command:->command' \
'*::arguments: _normal' \
&& return
case $state in
(command)
if ((CURRENT == 2)); then
# Insist that the first argument must be an option
compadd -- -d -e -f -p
else
compadd ssh ||
_command_names -e
fi
;;
esac
}
_sshpass "$@"
简要说明:
_arguments
安排带有选项的命令的完成。- 选项
-d
、-e
和-f
是-p
互斥的。(-d -e -f -p)-d…
指定 的补全,并声明如果选项、或之一已存在,则-d
不应提供该补全。-d
-e
-f
-p
-d+
-d
表示及其参数之间的空格是可选的。->command
第一个参数导致_arguments
设置$state
为command
并在下面继续执行。_normal
对于第一个非选项参数之后的参数会导致它们完成,就像命令行以第一个非选项参数开始一样。 after::
指示*
zsh 将选项从第一个非选项参数中删除。- 对于命令名称,请尝试完成传递给的名称
compadd
(如果需要,可以添加更多名称)。如果失败,请填写任何命令名称。