티스토리 뷰

개발/Linux

application 인자 자동완성 기능

Jaeyeon Baek 2014. 2. 11. 18:05


리눅스에서 application을 사용하면서 인자의 자동완성에 대해 궁금증이 생겼습니다. 예를들면 git의 경우 "git "을 타이핑하고 Tab키를 누르게 되면 아래처럼 입력 가능한 명령어들이 출력이 되는데요,

[oops@ ]$ git 
add                 cherry-pick         fetch               log                 relink              stage 
am                  ci                  filter-branch       lol                 remote              stash 
annotate            clean               format-patch        merge               repack              status 
apply               clone               fsck                mergetool           replace             submodule 
archive             commit              gc                  mv                  request-pull        svn 
bisect              config              get-tar-commit-id   name-rev            reset               tag 
blame               credential-cache    grep                notes               revert              whatchanged 
branch              credential-store    help                pull                rm                  
bundle              describe            imap-send           push                shortlog            
checkout            diff                init                rebase              show                
cherry              difftool            instaweb            reflog              show-branch         
[oops@ ]$ git 


직접 명령어를 만들어서, 인자 값이 검색되고 자동완성 되는 기능에 대해 공부해봤습니다. 일단 테스트를 위한 간단한 스크립트를 하나 추가합니다.

[oops@ ]$ cat oops 
#!/bin/sh

if [ $1 = "one" ]; then
        echo "one"
fi

if [ $1 = "two" ]; then
        echo "two"
fi
[oops@ ]$ 

(첫번째 인자에 one이면 one을 출력하고, two면 two를 출력하는 쉘입니다. 내용은 크게 중요하지 않습니다.)


그리고 자동완성 기능을 제공하는 리눅스의 특정 폴더에 파일을 추가해줍니다. 이때 추가해주는 파일에는 자동완성 관련 된 단어들이 포함 됩니다.

[oops@ ]$ cat /etc/bash_completion.d/oops
#!bash
#       my bash completion scripts
#

_test_fun()
{

        local cur prev
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"

        COMPREPLY=( $( compgen -W 'one two' -- "$cur" ) )

}
complete -F _test_fun oops


위와 같이 추가해주고요, oops 스크립트를 테스트 해봅니다. oops를 입력하고 Tab키를 누릅니다.

[oops@ ]$ oops 
one  two  
[oops@ ]$ oops one
one
[oops@ ]$ 


정상적으로 동작하는것을 확인 할 수 있습니다. 중요한 포인트는 /etc/bash_completion.d/oops 파일의 내용의 내용입니다. 더 전문적인 내용을 추가하기 위해서는 bash문법을 공부해봐야겠습니다.


Update

아래는 conda에서 자주 사용하는 몇 가지를 bash_completion 해본 예제입니다. 함께 참고해서 보시면 좋습니다.

https://gist.github.com/jybaek/0611faa6816f5438c524f241af8897a8


댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday