자동 완성 기능이 있는 스크립트를 만드는 방법은 무엇입니까?

자동 완성 기능이 있는 스크립트를 만드는 방법은 무엇입니까?

다음과 같은 프로그램을 사용 svn하고 Gnome Terminal에 입력하면 다음과 같습니다.

svn upd

그러면 Tab다음과 같이 자동 완성됩니다.

svn update

내 사용자 정의 bash 스크립트에서 이와 같은 작업을 수행할 수 있습니까?

답변1

새 파일을 만들어야 합니다.

/etc/bash_completion.d/foo

정적 자동 완성( 예: --help/ )의 경우 다음을 추가하세요.--verbose

_foo() 
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts="--help --verbose --version"

    if [[ ${cur} == -* ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _foo foo
  • COMP_WORDS현재 명령줄의 모든 개별 단어를 포함하는 배열입니다.
  • COMP_CWORD현재 커서 위치를 포함하는 단어의 인덱스입니다.
  • COMPREPLY Bash가 가능한 완성을 읽는 배열 변수입니다.

그리고 이 compgen명령은 의 요소 배열을 반환 --help하고 현재 단어와 일치 --verbose합니다 .--version"${cur}"

compgen -W "--help --verbose --version" -- "<userinput>"

원천

답변2

여기에 완전한 튜토리얼이 있습니다.

admin.sh자동 완성이 작동하도록 하려는 스크립트의 예를 살펴보겠습니다 .

#!/bin/bash

while [ $# -gt 0 ]; do
  arg=$1
  case $arg in
    option_1)
     # do_option_1
    ;;
    option_2)
     # do_option_2
    ;;
    shortlist)
      echo option_1 option_2 shortlist
    ;;
    *)
     echo Wrong option
    ;;
  esac
  shift
done

옵션을 참고하세요 shortlist. 이 옵션을 사용하여 스크립트를 호출하면 이 스크립트에 대해 가능한 모든 옵션이 인쇄됩니다.

여기에 자동 완성 스크립트가 있습니다.

_script()
{
  _script_commands=$(/path/to/your/script.sh shortlist)

  local cur
  COMPREPLY=()
  cur="${COMP_WORDS[COMP_CWORD]}"
  COMPREPLY=( $(compgen -W "${_script_commands}" -- ${cur}) )

  return 0
}
complete -o nospace -F _script ./admin.sh

완료할 마지막 인수는 자동 완성을 추가하려는 스크립트의 이름입니다. 당신이 해야 할 일은 자동 완성 스크립트를 bashrc에 다음과 같이 추가하는 것입니다.

source /path/to/your/autocomplete.sh

또는 다음 위치에 복사하세요.

/etc/bash_completion.d

답변3

당신은 사용할 수 있습니다프로그래밍 가능한 완성. /etc/bash_completion및 몇 가지 예를 살펴보십시오 /etc/bash_completion.d/*.

답변4

원하는 것이 간단한 단어 기반 자동 완성뿐인 경우(하위 명령 완성 등이 없음) 해당 complete명령에는 -W올바른 작업을 수행하는 옵션이 있습니다.

예를 들어, 다음과 같은 줄을 사용하여 다음 .bashrc과 같은 프로그램을 자동 완성합니다.주피터:

# gleaned from `jupyter --help`
_jupyter_options='console qtconsole notebook' # shortened for this answer
complete -W "${_jupyter_options}" 'jupyter'

이제 jupyter <TAB> <TAB>자동 완성됩니다.

그만큼문서gnu.org의 내용이 도움이 됩니다.

변수가 올바르게 설정되었는지 여부에 의존하는 것 같지만 IFS이로 인해 아무런 문제가 발생하지 않았습니다.

파일 이름 완성 및 기본 BASH 완성을 추가하려면 다음 -o옵션을 사용하십시오.

complete -W "${_jupyter_options}" -o bashdefault -o default 'jupyter'

complete이를 zsh에서 사용하려면 다음에서 명령을 실행하기 전에 다음 코드를 추가하세요 ~/.zshrc.

# make zsh emulate bash if necessary
if [[ -n "$ZSH_VERSION" ]]; then
    autoload bashcompinit
    bashcompinit
fi

관련 정보