我有一个自定义脚本,需要一个 形式的参数--host=hostname
,并允许一个可选参数-n, --dry-run
。
我已经创建了zsh
完成,其中提供了可选参数:
#compdef sync-data.sh
_sync-data.sh () {
local -a args
args+=(
'(-n --dry-run)'{-n,--dry-run}'[show what would have been transferred]'
)
_arguments $args && return
}
_sync-data.sh "$@"
但我如何添加必需的--host=hostname
,以便:
- 它作为第一个参数完成
- 之后的部分
=
是根据我的_hosts
完成情况完成的 --dry-run
--host=
仅在提供所需选项后才提供完成--host=hostname
提供after ,并且可选地--dry-run
,不提供其他补全(即,没有本地文件名)。
答案1
1+2) 将如下内容作为参数添加到 _arguments 中:
'--host=[specify host]:host:_hosts'
方括号中的部分是可能需要改进的描述。
使添加
--dry-run
成为args
条件。(( CURRENT > 2 ))
从第二个单词开始添加。检查命令行上(( $words[(I)--host*] ))
是否存在。--host
这取决于什么是合适的。这应该是默认情况。
您的函数中添加了一些多余的元素。无需将 a 定义_sync-data.sh
为文件的全部内容,然后调用它。仅当您从一个函数定义多个函数时,这才有用。自动加载函数已经是一个函数了。而且,这&& return
是多余的。函数传递最后一个命令的返回状态。
根据评论请求的整个代码:
#compdef sync-data.sh
local -a args
(( $words[(I)--host*] )) && args+=(
'(-n --dry-run)'{-n,--dry-run}'[show what would have been transferred]'
)
_arguments $args \
'--host=[specify host]:host:_hosts'