Skip to content
TUWLAB.com
모든 게시물에 대하여 '링크'
방식의 퍼가기만 허용합니다.
한양대학교 전자통신컴퓨터공학부
바라미
  • 593
  • 2573257
DNS Powered by DNSEver.com
Linux

[Bash] 자동완성 스크립트(Completion Script) 작성 방법과 동작 원리

Posted 2019. 08. 28 Updated 2019. 08. 28 Views 7498 Replies 0

Bash의 내장 명령(Built-in Command)중 하나인 complete는 특정 명령에 대한 자동완성(Autocomplete) 목록을 정의한다.

자동완성 정의 명령 - complete

자동완성 추천 단어 목록(Suggestions)이 고정되어 있으면 ~/.bashrccomplete명령 한 줄만 추가해서 커스텀 자동완성을 정의할 수 있긴 하다. 하지만, 대개 추천 목록을 그때 그때 상황에 맞춰 동적으로 생성해야 하는 경우가 대부분이므로, 다음과 같이 -F 옵션으로 자동완성 함수를 지정하는 방식으로 사용한다.

complete -F <함수> <명령>

셸에 <명령>을 입력하고 [Tab]키를 눌러서 자동완성을 시도하면 <함수>가 호출된다. <함수>가 추천 단어 목록을 만들어 반환하면 자동완성이 되거나(추천 단어가 1개인 경우), 셸에 추천 단어들이 출력(추천 단어가 여러개인 경우)된다.

 

자동완성 스크립트

 커스텀 자동완성을 정의할 때는 (편의상) 명령별로 스크립트를 따로 만들어 /etc/bash_completion.d/ 디렉토리에 집어넣어 사용한다. 이 디렉토리 내의 자동완성 스크립트들은 로그인 시점에 실행되어 사용자 셸에 적용된다. (특정 사용자에게만 사용 가능한 자동완성을 정의하려면 ~/.bashrc를 활용하면 된다.)

다음은 mycmd 명령에 대해 /var/www/의 하위 디렉토리들에 대한 경로를 자동완성으로 제공하는 스크립트의 예시이다.

_mycmd_autocomplete() {
    local cur
    cur=${COMP_WORDS[COMP_CWORD]}
    COMPREPLY=( $(compgen -W '$(find /var/www -mindepth 1 -maxdepth 1 -type d -printf "%P ")' -- $cur ) )
}
complete -F _mycmd_autocomplete mycmd

자동완성 함수는 전역변수 COMPREPLY를 통해 자동완성 추천 단어 목록을 전달한다. 이 때, 목록에서 현재 입력중인 단어를 Prefix로 하는 단어들만 추려내기 위해 compgen 명령을 보조로 사용한다.

compgen -W '단어1 단어2 ... 단어N' -- "<Prefix>"

뒤쪽의 "-- $cur" 부분이 현재 입력중인 단어를 전달하는 인수이다. 이 $cur를 만들어내기 위해 다음 전역 변수들을 사용하였다. 이 전역 변수들은 자동완성 함수가 호출될 때 세팅되어 전달된다.

  • $COMP_WORDS: 현재 셸에 입력된 단어(공백으로 구분된 토큰) 목록
  • $COMP_CWORD: 현재 셸에 입력중인 단어의 순번(Index)

예를 들어, 셸에 다음과 같이 입력하고 자동완성을 위해 [Tab]키를 눌렀을 때, 자동완성 함수에 전달되는 전역변수들은 다음과 같이 세팅된다.

mycmd /var/www/andromeda /var/www/t
$COMP_WORDS[0] = "mycmd"
$COMP_WORDS[1] = "/var/www/andromeda"
$COMP_WORDS[2] = "/var/www/t"
$COMP_CWORD = 2

참고: $COMP_CWORD가 항상 $COMP_WORDS의 Index 최대값과 같지는 않은데, 입력 중인 명령의 중간 부분에서 자동완성을 시도할 수도 있기 때문이다.

 

자동완성 스크립트 응용

 자동완성 함수 호출시 함께 전달되는 전역변수들을 잘 활용하면 추천 목록을 보다 세밀하게 다듬어서 제공할 수 있다.

아래 자동완성 스크립트는 위의 예시를 조금 변형해서 다음과 같은 기능을 추가한 것이다.

  • 첫 번째 인수에 대해서만 자동완성을 실행한다.
  • 전체 경로가 아닌, 디렉토리 이름만을 자동완성으로 제공한다.
_mycmd_autocomplete() {
    local cur list
    cur=${COMP_WORDS[COMP_CWORD]}
    list=""
    if [ ${COMP_CWORD} != 1 ]; then
        return
    fi
    for dir in $(find /var/www/ -mindepth 1 -maxdepth 1 -type d); do
        list="${list} $(basename ${dir})"
    done
    COMPREPLY=( $(compgen -W '${list}' -- $cur ) )
}
complete -F _mycmd_autocomplete mycmd

 

서비스 선택
이용중인 SNS 버튼을 클릭하여 로그인 해주세요.
SNS 계정을 통해 로그인하면 회원가입 없이 댓글을 남길 수 있습니다.
댓글
?
Powered by SocialXE

List of Articles
번호 분류 제목 글쓴이 최근 수정일 조회 수
193 일반 회전거울을 사용한 3D 디스플레이 file TUW 2021.12.28 6671
192 일반 형광등기구 안정기 교환 file TUW 2021.12.28 11960
191 Linux 한글 입력기 나비(Nabi)에서 한/영 키가 인식되지 않는 경우 file TUW 2017.06.02 2403
190 일반 하드디스크 작동 모습 TUW 2021.12.28 10101
189 일반 페이스북 글 입력 필드 분석 file TUW 2017.06.02 10415
188 일반 트랜지스터의 회로기호와 핀 명칭 file TUW 2017.06.02 13100
187 Linux 좀 더 '진짜같이' VirtualBox 활용하기 - 심리스 모드 외 file TUW 2017.06.02 43290
186 일반 제트엔진의 작동원리 동영상 TUW 2014.04.16 8104
185 일반 정규식(Regular Expression)에 대한 소개와 입문, 튜토리얼 1 file TUW 2017.12.11 36240
184 일반 전력선 통신(PLC; Power Line Communication) TUW 2014.04.16 13201
183 일반 영어로 나타낸 수학 용어 모음 2 file TUW 2018.01.08 82420
182 Android 안드로이드 개발 관련 참조사이트 TUW 2014.04.20 18038
181 Android 안드로이드 가상머신을 활용하여 PC에서 카카오톡 사용하기 file TUW 2017.06.02 20158
180 Android 안드로이드 Hello, World?! file TUW 2017.06.02 17613
179 Android 안드로이드 AVD에 한글 키보드 설치하기 file TUW 2017.06.02 20711
178 일반 신호 레벨 변환 회로(Level Transceiver/Translator/Shifter) 설계 file TUW 2021.12.28 47891
목록
Board Pagination Prev 1 2 3 4 5 6 7 ... 13 Next
/ 13

Powered by Xpress Engine / Designed by Sketchbook

sketchbook5, 스케치북5

sketchbook5, 스케치북5