Shell

zsh 以 –host=hostname 形式完成

  • February 15, 2021

我有一個自定義腳本,它需要一個 形式的參數--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 "$@"

但是我怎樣才能添加 required --host=hostname,以便:

  1. 它作為第一個參數完成
  2. 之後的部分=是從我的完成中_hosts完成的
  3. --dry-run僅在提供所需選項後才提供--host=完成
  4. after--host=hostname提供,並且可選地--dry-run,不提供其他完成(即,沒有本地文件名)。

1+2) 將以下內容作為參數添加到_arguments:

   '--host=[specify host]:host:_hosts'

方括號中的部分是可以改進的描述。

  1. 使添加--dry-runargs條件。(( CURRENT > 2 ))從第二個單詞開始添加。(( $words[(I)--host*] ))檢查--host命令行上是否存在。這取決於什麼是合適的。
  2. 這應該是預設情況。

你的函式中有一些多餘的元素。無需將 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'

引用自:https://unix.stackexchange.com/questions/634518