我使用的sshpass命令如下:
sshpass -p 'my_password' ssh user@server根据手册页,完整的语法是
sshpass [-ffilename|-dnum|-ppassword|-e] [options] command arguments目前,zsh没有任何sshpass的完成规则。我如何创建简单的完成规则,以便在我到达“命令”和“参数”时,完成命令的ssh,而user@host与标准ssh的完成相同?
发布于 2020-07-11 22:38:00
您可以从具有类似语法的命令中获得灵感,例如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会导致它们被完成,就像命令行以第一个非选项参数开始一样。::在*之后指示zsh删除第一个非选项参数的选项。compadd的名称(如果需要,可以添加更多的名称)。如果此操作失败,请填写任何命令名。https://unix.stackexchange.com/questions/597966
复制相似问题