탭 완성을 유지하는 별칭이나 함수를 만들려면 어떻게 해야 합니까?

탭 완성을 유지하는 별칭이나 함수를 만들려면 어떻게 해야 합니까?

systemd를 사용할 때 일부 키 입력을 저장하기 위해 별칭을 만들었습니다.

$ alias sctl='systemctl'

그러나 이로 인해 하위 명령의 탭 완성이 중단됩니다. 탭 완성을 중단하지 않고 명령에 별칭을 추가할 수 있습니까?

답변1

systemctl먼저 이 명령이 어떤 완전한 기능을 사용하는지 알아보세요 .

complete | grep " systemctl$"

출력은 다음과 같습니다.

complete -F _functionname systemctl

그런 다음 다음을 사용하십시오.

complete -F _functionname sctl

별칭을 완성하는 함수를 등록합니다.

이제 입력할 때와 sctl <tab><tab>동일한 제안 사항이 표시됩니다.systemctl

답변2

설치 후이 도구, 다음과 같이 할 수 있습니다.

  • 존재하다 ~/.bash_profile:

    alias sctl='systemctl'
    
  • 존재하다 ~/.bash_completion:

    complete -F _complete_alias sctl
    
  • 명령을 sctl <tab>표시하려면 다음을 입력하십시오 .systemctl

    $ sctl <Tab>
    add-requires
    add-wants
    cancel
    cat
    condreload
    ...
    

답변3

systemctl+args에서도 완료가 작동하도록 이것을 해킹했습니다. systemctl이 관리할 bash-completion 소스 코드의 일부를 복사했습니다(/usr/share/bash-completion/completions/systemctl).

alias ssr='sudo systemctl restart'
alias sss='sudo systemctl status'
alias ssp='sudo systemctl stop'

# Load necessary functions in bash-completion's source code for systemctl (get_*_units)
source /usr/share/bash-completion/completions/systemctl
# Manually recreate some functions
_systemctl_status()
{
        comps=$( __get_non_template_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_restart()
{
        comps=$( __get_restartable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

_systemctl_stop()
{
        comps=$( __get_stoppable_units --system "${COMP_WORDS[1]}" )
        compopt -o filenames
        COMPREPLY=( $(compgen -o filenames -W '$comps') )
        return 0
}

complete -F _systemctl_restart ssr
complete -F _systemctl_status sss
complete -F _systemctl_stop ssp

이는 다른 systemctl 명령으로 쉽게 확장될 수 있습니다. 소스 파일에서 올바른 get_*_units 명령을 찾아 예제를 복사하면 됩니다.

또한 모든 명령에 대해 작동하는 일반적인 솔루션을 얻기 위해 $COMP_WORDS 배열을 수정하려고 시도했지만 소용이 없었습니다.

관련 정보