Bash 완성 스 크 립 트 작성
6808 단어 bashshell보충 하여 완전 하 게 하 다Linux
리 눅 스에 게 자동 완성 은 더 이상 익숙 할 수 없 는 기능 이다.명령 행 에서 다음 부분의 명령 을 두 드 렸 을 때, 본능적으로 Tab 키 를 눌 러 완전한 명령 을 보완 할 것 입 니 다. 물론 명령 보완 외 에 도 파일 이름 보완 도 있 습 니 다.
Bash-completion
이 기능 을 자동 으로 보완 하 는 것 은 Bash 자체 가 가지 고 있 지만, 일반적으로 우 리 는 bash - completion 패 키 지 를 설치 하여 더 좋 은 보완 효 과 를 얻 을 수 있 습 니 다. 이 패 키 지 는 기 존의 명령 보완 스 크 립 트 를 제공 합 니 다. 일부 기본 적 인 함수 들 은 스 크 립 트 를 작성 하 는 데 편리 하고 기본 적 인 설정 스 크 립 트 도 있 습 니 다.하지만 앞서 말 했 듯 이 이 가방 은 꼭 필요 한 것 이 아니 라 힘 을 절약 할 수 있 을 뿐이다.
bash - completion 이 가방 의 설치 위 치 는 발행 판 에 따라 다 르 지만 대체적으로 사용 하 는 원 리 는 비슷 합 니 다. 보통 bash 라 는 이름 이 있 습 니 다.completion 스 크 립 트 입 니 다. 이 스 크 립 트 는 셸 이 초기 화 될 때 불 러 옵 니 다.예 를 들 어 RHEL 시스템 에 있어 서 이 스 크 립 트 는/etc/bash 에 있 습 니 다.completion, 이 스 크 립 트 는/etc/profile. d/bashcompletion. sh 에서 가 져 오기:
# Check for interactive bash and that we haven't already been sourced.[ -z "$BASH_VERSION" -o -z "$PS1" -o -n "$BASH_COMPLETION" ] && return# Check for recent enough version of bash.bash=${BASH_VERSION%.*}; bmajor=${bash%.*}; bminor=${bash#*.}if [ $bmajor -gt 3 ] || [ $bmajor -eq 3 -a $bminor -ge 2 ]; then
if shopt -q progcomp && [ -r /etc/bash_completion ]; then
# Source completion code.
. /etc/bash_completion fifiunset bash bmajor bminor
그리고 bashcompletion 스 크 립 트 에/etc/bash 를 불 러 옵 니 다.completion. d 아래 완성 스 크 립 트:
if [[ $BASH_COMPLETION_DIR != $BASH_COMPLETION_COMPAT_DIR && \ -d $BASH_COMPLETION_DIR && -r $BASH_COMPLETION_DIR && \ -x $BASH_COMPLETION_DIR ]]; then
for i in $(LC_ALL=C command ls "$BASH_COMPLETION_DIR"); do
i=$BASH_COMPLETION_DIR/$i [[ ${i##*/} != @(*~|*.bak|*.swp|\#*\#|*.dpkg*|*.rpm@(orig|new|save)|Makefile*) \
&& -f $i && -r $i ]] && . "$i"
donefiunset i
스 크 립 트 의 이름 은 보통 명령 이름 입 니 다. 쉽게 찾 을 수 있 습 니 다.
$ ls i*iconv iftop ifupdown info iproute2 iptables
내장 보완 명령
Bash 에는 두 개의 보전 명령 이 내장 되 어 있 는데 각각
compgen
과 complete
이다.compgen
명령 은 서로 다른 매개 변수 에 따라 단어 와 일치 하 는 후보 완성 목록 을 생 성 합 니 다. 예 를 들 어:$ compgen -W 'hi hello how world' h
hi
hello
how
compgen
가장 많이 사용 되 는 옵션 은 - W 입 니 다. - W 매개 변 수 를 통 해 빈 칸 으로 구 분 된 단어 목록 을 지정 합 니 다.h. 명령 행 에 현재 입력 한 단 어 를 실행 한 후에 후보 와 일치 하 는 목록 을 출력 합 니 다. 여 기 는 h 로 시작 하 는 모든 단어 입 니 다.complete
명령 의 매개 변 수 는 약간 유사 합 니 다 compgen
. 그러나 명령 을 어떻게 보완 하 는 지 설명 하 는 역할 을 합 니 다. 예 를 들 어 - W 매개 변 수 를 사용 하여 후 보 를 지정 하 는 단어 목록 입 니 다.$ complete -W 'word1 word2 word3 hello' foo
$ foo w$ foo wordword1 word2 word3
우 리 는 - F 매개 변 수 를 통 해 보완 함 수 를 지정 할 수 있 습 니 다.
$ complete -F _foo foo
현재 foo 명령 을 입력 하면 호출foo 함수 로 보 완 된 목록 을 만 들 고 보 완 된 기능 을 완성 하 는 것 이 바로 스 크 립 트 를 보완 하 는 관건 입 니 다. 뒤에서 소개 하 겠 습 니 다.
관련 내 장 된 변 수 를 보완 합 니 다.
위의 두 개의 보완 명령 을 제외 하고 Bash 는 몇 개의 내 장 된 변 수 를 보조 적 으로 보완 하 는 기능 을 가지 고 있 습 니 다. 여기 서 주로 세 가 지 를 소개 합 니 다.
COMP_WORDS
: 유형 은 배열 로 현재 명령 행 에 입력 한 모든 단 어 를 저장 합 니 다.COMP_CWORD
: 종 류 는 정수 이 고 현재 커서 에 입력 한 단 어 는 COMP 에 있 습 니 다.WORDS 배열 의 색인;COMPREPLY
: 유형 은 배열 이 고 후보의 보전 결과 이다.COMP_WORDBREAKS
: 형식 은 문자열 로 단어 간 의 구분자 임 을 나타 낸다.COMP_LINE
: 형식 은 문자열 로 현재 명령 행 의 입력 을 표시 합 니 다.예 를 들 어 우 리 는 이러한 보전 함 수 를 정의 합 니 다foo:
$ function _foo()> {> echo -e "
"> > declare -p COMP_WORDS> declare -p COMP_CWORD> declare -p COMP_LINE> declare -p COMP_WORDBREAKS> }$ complete -F _foo foo
만약 에 우리 가 명령 행 아래 에 다음 내용 을 입력 하고 Tab 키 를 누 르 면 완성 합 니 다.
$ foo b
declare -a COMP_WORDS='([0]="foo" [1]="b")'declare -- COMP_CWORD="1"declare -- COMP_LINE="foo b"declare -- COMP_WORDBREAKS="
\"'><=;|&(:"
위의 결과 에 대해 나 는 이 몇 개의 변 수 를 비교적 쉽게 이해 할 수 있 을 것 이 라 고 생각한다.물론 우리 가 전에 말 했 듯 이 Bash - completion 가방 은 필수 적 인 것 이 아니 라 보완 기능 은 Bash 자체 가 가지 고 있 는 것 이 라 고 합 니 다.
스 크 립 트 를 작성 하 다
완성 스 크 립 트 는 두 부분 으로 나 뉘 어 있 습 니 다. 완성 함수 와 사용
complete
명령 을 작성 하여 완성 함 수 를 사용 합 니 다.후자 의 난이 도 는 거의 무시 하고 보완 함 수 를 어떻게 쓰 느 냐 에 중점 을 두 고 있다.어 려 운 점 은 인터넷 에서 이와 관련 된 문서 가 매우 적은 것 같 지만 사실은 Bash - completion 이 자체 적 으로 가지 고 있 는 보완 스 크 립 트 가 가장 좋 은 출발점 이 므 로 몇 가지 간단 한 수정 을 고 르 면 대체적으로 사용 할 수 있다.일반 완성 함수 (여기 가 여전히 foo 라 고 가정) 는 다음 과 같은 두 변 수 를 정의 합 니 다.
local cur prev
그 중에서 cur 는 현재 커서 아래 의 단 어 를 표시 하고 prev 는 이전 단어 에 대응 합 니 다.
cur="${COMP_WORDS[COMP_CWORD]}"prev="${COMP_WORDS[COMP_CWORD-1]}"
해당 변 수 를 초기 화 한 후, 우 리 는 보완 행 위 를 정의 해 야 합 니 다. 즉, 무엇 을 입력 한 상태 에서 어떤 내용 을 보완 하 는 지, 예 를 들 어 입력 - 시작 옵션 을 입력 할 때, 우 리 는 모든 옵션 을 후보 로 하 는 보완 결과 입 니 다.
local opts="-h --help -f --file -o --output"if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0fi
그러나 COMPREPLY 에 값 을 부여 하기 전에 다른 완성 함수 에 의 해 방 해 받 지 않도록 초기 화 하 는 것 이 좋 습 니 다.
현재 완전한 완성 함 수 는 다음 과 같 습 니 다:
function _foo() {
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="-h --help -f --file -o --output"
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi}
현재 명령 줄 아래 에서 foo 명령 에 대한 매개 변 수 를 보완 할 수 있 습 니 다:
$ complete -F _foo foo
$ foo --f --file -h --help -o --output
물론, 우리 가 있 는 이곳 의 예 는 prev 변 수 를 사용 하지 않 은 것 같다.prev 변 수 를 잘 사용 하면 보완 결 과 를 더욱 완전 하 게 할 수 있 습 니 다. 예 를 들 어 -- file 을 입력 한 후에 우 리 는 특수 한 파일 을 보완 하고 싶 습 니 다 (. sh 로 끝 나 는 파일 을 가정 합 니 다).
case "${prev}" in
-f|--file)
COMPREPLY=( $(compgen -o filenames -W "`ls *.sh`" -- ${cur}) )
;;
esac
이제 foo 명령 을 실행 하면 -- file 매개 변수의 값 도 보완 할 수 있 습 니 다.
$ foo --filea.sh b.sh c.sh
완성 스 크 립 트 설치
Bash - completion 패키지 가 설치 되 어 있 으 면, 완성 스 크 립 트 를/etc/bash 에 놓 을 수 있 습 니 다.completion. d 디 렉 터 리 아래 에 두 거나 ~/. bashcompletion 파일 중.Bash - completion 패키지 가 설치 되 어 있 지 않 으 면 ~/. bashrc 또는 셸 에 불 러 올 수 있 는 초기 화 파일 에 스 크 립 트 를 추가 할 수 있 습 니 다.
참조 링크
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
성공할 때까지 명령 실행최근에 유용한 간단한 BASH 패턴: Run command every time it fails until it doesn't fail. 예시 작은 배치로 수십만 개의 레코드를 내보내야 하는 장기 실행 작업이 있었습니...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.