사용자 정의 bash_completion.d 스크립트의 표준 장소?


47

나는 bash 스크립트와 해당 bash 자동 완성 규칙을 개발 한 Linux (Suse) 시스템에 사용자 액세스 (루트 없음)가 있습니다.

스크립트는 내 사용자에게만 해당되므로 완전한 루트 규칙이 필요합니다 (루트 쓰기 액세스 권한이 없다는 사실의 일부). bash_completion 스크립트를 /etc/bash_completion.d/폴더에 배치 하는 것은 옵션이 아닙니다.

현재 파일 이름을 지정하고 파일 .bash_completion.myscript을 직접 소스로 제공 .bashrc했지만 bash 구현에서 이미 고려한 이러한 결과를 달성하는 다른 "표준"방법이 있는지 궁금합니다.

예를 들어 폴더를 만드 /home/myuser/.bash_completion.d/시겠습니까?

답변:


36

~/.bash_completion파일을 사용 하십시오.

로부터 배쉬 완료 자주 묻는 질문 :

Q.
새 릴리스를 발행 할 때마다 다시 작성하지 않고 자체 로컬 완료를 삽입하려면 어떻게 해야합니까?

A. ~ / .bash_completion에 넣으십시오
.이 스크립트 는 기본 완성 스크립트 의 끝에서 구문 분석됩니다 . 다음 질문도 참조하십시오.

Q. 패키지 X를 작성 / 유지 관리하며이 패키지에
대한 자체 완성 코드 를 유지하고 싶습니다 .
대화식 bash 쉘이 찾아서 소스로 만들 려면 어디에 두어야 합니까?

A.
bash-completion의 pkgconfig 파일 변수가 가리키는 디렉토리 중 하나에 설치하십시오 . 두 가지가 있습니다
대안 : 권장 한 'completionsdir'(그것을 얻을 것입니다
있는 "PKG-설정 --variable = completionsdir bash는 완성")
, 완료가 호출 명령의 이름에 따라 수요에로드
이렇게 이름을 반드시 당신의 파일 이 둘 이상의 명령에 대해
완료
를 제공하는 경우 예를 들어 기호 링크 를 포함 합니다 .
이전 버전과의 호환성을 위해 존재하는 다른 하나 는 'compatdir'입니다 (
"pkg-config --variable = compatdir bash-completion"사용)


묻기 전에 serverfault에서 많은 것을 검색하고 검색했지만 가장 기본적인 단계 인 RTFM에 대해서는 생각하지 않았습니다. 답변 주셔서 감사합니다!
Carles Sala

4
.bash_completion디렉토리가 아닌 파일 임을 지정할 수 있습니다. bash_completion.d디렉토리 이기 때문에 scp로컬 bash_completion.d서버로 원격 서버에서 이름을 바꿀 수 있다고 가정 했지만 다음 로그인에서는 파일이어야한다고 말했습니다.
NobleUplift 18시 41 분

3
@NobleUplift Bash Completion FAQ 가 변경되었으며 이제 요청시 디렉토리에서 사용자 Bash 완료를로드하는 방법에 대한 정보가 포함되어 있습니다. 이것은 bash-completion 버전 2.8 이상에서는 작동하지만 2.1에서는 작동하지 않는 것 같습니다. 디렉토리의 파일 이름은 명령의 이름과 정확히 동일해야하며, 그렇지 않으면 기호 링크를 사용할 수 있습니다.
jarno

@jarno 나는 우리의 시스템에서 bash는 완료 모든 사용자 정의 프로그램에 대한 스크립트와 스크립트를 코딩하지만 내 수석 개발자 :(를 격추
NobleUplift

@NobleUplift 왜? 어쨌든 스스로 사용할 수 있습니다.
jarno

49

로컬 사용자가 작업 ~/.bash_completion.d/디렉토리를 가질 수있는 방법은 다음과 같습니다 .

  1. 파일 편집 : nano ~/.bash_completion, 다음을 추가하십시오.

    for bcfile in ~/.bash_completion.d/* ; do
      . $bcfile
    done
    
  2. 디렉토리를 만드십시오 : mkdir ~/.bash_completion.d

  3. 파일 편집 : ~/.bash_completion.d/myscript, 다음을 추가하십시오.

    _myscript_tab_complete () {
        local cur prev opts
        COMPREPLY=()
        cur="${COMP_WORDS[COMP_CWORD]}"
        prev="${COMP_WORDS[COMP_CWORD-1]}"
        words="-f -h --etc"
    
        COMPREPLY=( $(compgen -W "${words}" -- ${cur}) )
        return 0
    }
    complete -F _myscript_tab_complete myscript
    
  4. 소스 .bash_completion : . ~/.bash_completion

최신 정보

~/.bash_completion.d/디렉토리가 있을 것으로 예상 하고 오류 메시지가 표시되지 않게하려면을 사용하여 bash: /home/<username>/.bash_completion.d/*: No such file or directory파일 유형 테스트를 추가하십시오 [ -f "$bcfile" ].

for bcfile in ~/.bash_completion.d/* ; do
  [ -f "$bcfile" ] && . $bcfile
done

2

Russell E Glaue답변 은 훌륭하지만 ~/.bash_completion불완전합니다.

문제는 ~/.bash_completion.d/비어있는 for f in ~/.bash_completion.d/*경우에 다음과 같은 오류 메시지를 인쇄합니다.

-bash : /home/user/.bash_completion.d/* : 해당 파일이나 디렉토리가 없습니다.

가장 간단한 휴대용 솔루션은 디렉토리가 비어있는 경우 루프를 건너 뛰는 것입니다.

if [[ -d ~/.bash_completion.d/ ]] && \
   ! find ~/.bash_completion.d/. ! -name . -prune -exec false {} +
then
    for f in ~/.bash_completion.d/*
    do
        source "$f"
    done
fi

1

더 간단한 해결책은 nullglob 옵션을 사용하는 것입니다. 이것은 이식성이 없지만 bash 완성도 아닙니다. 따라서 이식성은 중요하지 않습니다.

또한 소싱 할 때 변수 주위에 따옴표를 사용하고 싶을 것입니다. 파일에 다른 다른 특수 문자가있는 경우를 처리합니다.

shopt -s nullglob

for f in ~/.bash_completion.d/*; do
  [ -f "$f" ] && . "$f"
done

1
참고로, 표시되는 내용에 대한 설명 (또는 문서 링크 nullglob)은 독자에게 도움이됩니다.
Cometsong

1

적어도 bash-completion 2.8 이상은 로컬 Bash 완료를 디렉토리에 배치하는 옵션을 활성화합니다.

${BASH_COMPLETION_USER_DIR:-${XDG_DATA_HOME:-$HOME/.local/share}/bash-completion}/completions

완료 파일 이름 또는 기호 링크 이름은 해당 명령 이름과 일치해야합니다. 이러한 완료는 요청시에만로드됩니다. 파일에 저장된 완료 ~/.bash_completion는 항상로드됩니다.

참조 : "Q. 자체 로컬 설치를 어디에 설치해야합니까?"를 참조하십시오. 에서 https://github.com/scop/bash-completion/blob/master/README.md

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.