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입니다 . 완성을 지정하고, 또는 옵션 중 하나가 이미 존재하는 경우 완성을 제공하지 않아야 함을 선언합니다.-p(-d -e -f -p)-d…-d-d-e-f-p
  • -d+-d표현과 인수 사이의 공백은 선택 사항입니다.
  • ->command첫 번째 매개변수는 다음 으로 _arguments설정 되고 아래에서 실행이 계속됩니다.$statecommand
  • _normal옵션이 아닌 첫 번째 인수 뒤의 인수는 마치 명령줄이 옵션이 아닌 첫 번째 인수로 시작된 것처럼 완료됩니다. after는 옵션이 아닌 첫 번째 인수에서 옵션을 제거하도록 zsh에 ::지시합니다 .*
  • 명령 이름의 경우 전달된 이름을 완성해 보세요. compadd필요한 경우 이름을 더 추가할 수 있습니다. 실패하면 명령 이름을 입력하십시오.

관련 정보