명령 별칭에 대한 bash 완성을 얻는 방법은 무엇입니까?

명령 별칭에 대한 bash 완성을 얻는 방법은 무엇입니까?

명령줄 별칭에서 탭 완성 기능을 사용하고 싶습니다. 예를 들어 다음 별칭을 정의한다고 가정하겠습니다.

alias apt-inst='sudo aptitude install'

Tab 키를 눌렀을 때 aptitude에서 제공하는 완성을 얻을 수 있는 방법이 있나요? 즉, "sudo aptitude install gnumer"라고 쓰고 탭을 누르면 aptitude가 gnumeric으로 완료하거나, 확실하지 않은 경우 gnumer로 시작하는 사용 가능한 모든 패키지를 나열합니다. 내 별칭을 사용하여 이 작업을 수행하면 아무 일도 일어나지 않습니다. 아무 작업도 수행되지 않습니다.

답변1

노력하다전체 별칭, 이 문제를 정확하게 해결합니다. (부인 성명complete_alias: 나는)의 저자입니다

일단 설치되면 공통 함수를 사용하여 다음과 같은 많은 별칭을 수행할 수 있습니다.

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

complete_alias또는 유사한 를 통해 각 bash 인스턴스에서 이 파일을 얻을 수 있습니다 .bash_profile.

설치하다

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
     > ~/.bash_completion.d/complete_alias

애플리케이션

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

container이제 _docker()원래 완료 처리기에 의해 자동으로 완료될 수 있습니다.

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

답변2

가지다Ubuntu 포럼에는 이 문제에 대한 훌륭한 스레드가 있습니다.. Ole J는 다음과 같은 별칭 완성 정의 기능을 제안했습니다.

function make-completion-wrapper () {
  local function_name="$2"
  local arg_count=$(($#-3))
  local comp_function_name="$1"
  shift 2
  local function="
    function $function_name {
      ((COMP_CWORD+=$arg_count))
      # Quotes here are important
      COMP_WORDS=( "$@" \"\${COMP_WORDS[@]:1}\" )
      "$comp_function_name"
      return 0
    }"
  eval "$function"
  echo $function_name
  echo "$function"
}

이를 사용하여 별칭에 대한 완성 함수를 정의한 다음 해당 함수를 별칭의 완성자로 지정합니다.

make-completion-wrapper _apt_get _apt_get_install apt-get install
complete -F _apt_get_install apt-inst

나는 기존 프로그램에 일반적으로 사용되는 매개변수를 추가하기 위해 별칭을 사용하는 것을 선호합니다. 예를 들어 grep저는 항상 장치와 바이너리를 건너뛰고 싶었기 때문에 grep. 예를 들어 새 명령을 추가하려면 grepbin폴더에 있는 쉘 스크립트를 사용합니다 ~/bin. 폴더가 경로에 있으면 자동으로 수행됩니다.

답변3

이 문제는 인터넷 검색에서 끝났으므로 다른 답변의 방법을 시도했습니다. 실제로 이해하지 못하는 여러 가지 이유로 Ubuntu 16.04에서는 제대로 작동하지 않았습니다.

결국 나를 위해 일하게 된 것은 예상보다 사소한 일이었습니다. 와 동일한 자동 완성 rsync기능을 사용하고 싶습니다 mycommand. 그래서 자동완성 기능을 찾아서 그에 complete맞게 호출했습니다.

# Lookup of name of autocompletion function used for rsync
_completion_loader rsync; complete -p rsync
# Returns: complete -o nospace -F _rsync rsync

# Sourcing the rsync functions before, then using the same function for 'mycommand'
. /usr/share/bash-completion/completions/rsync
complete -o nospace -F _rsync mycommand

면책조항: 다른 방법과 비교했을 때 내 방법의 단점이 무엇인지 잘 모르겠습니다. 나는 주로 사람들에게 도움이 될 수 있고 이 간단한 접근 방식으로 충분할 수 있기 때문에 이 글을 쓰고 있습니다.

답변4

2018 답변

"complete" 프로그램에 별칭을 추가해야 합니다. 달성하려는 자동 완성 유형에 따라 -c 또는 -F를 사용해야 합니다.

패키지 자동 완성의 경우:

complete -c name_of_your_alias

명령 자동 완성의 경우:

complete -F name_of_your_alias

별칭이 올바르게 추가되었는지 확인하려면 다음을 수행하세요.

complete | grep name_of_your_alias

마지막으로 "full"에서 별칭을 제거합니다.

complete -r name_of_your_alias

귀하의 경우:

complete -c apt-inst

관련 정보