sshpassのzshの完成

sshpassのzshの完成

私は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です。補完を指定するか、またはオプションの1つがすでに存在する場合は補完を提供しないことを宣言します。-p(-d -e -f -p)-d…-d-d-e-f-p
  • -d+-d表現と引数の間のスペースはオプションです。
  • ->command最初のパラメータは次のように_arguments設定され、以下で実行が続行されます。$statecommand
  • _normalオプションではない最初の引数の後の引数は、コマンドラインがオプションではなく最初の引数で始まったかのように完了します。 afterは、オプションではなく最初の引数からオプションを削除するようにzshに::指示します。*
  • コマンド名の場合は、渡された名前を完成させてください。compadd必要に応じて名前を追加できます。失敗した場合は、コマンド名を入力してください。

おすすめ記事