사용자 정의 bash_completion.d 스크립트의 표준 장소? (루트 쓰기 액세스 권한이 없다는

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

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

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

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



답변

~/.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”사용)


답변

로컬 사용자가 작업 ~/.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

답변

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


답변

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

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

shopt -s nullglob

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


답변

적어도 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


답변