나는 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/
디렉토리를 가질 수있는 방법은 다음과 같습니다 .
-
파일 편집 :
nano ~/.bash_completion
, 다음을 추가하십시오.for bcfile in ~/.bash_completion.d/* ; do . $bcfile done
-
디렉토리를 만드십시오 :
mkdir ~/.bash_completion.d
-
파일 편집 :
~/.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
-
소스 .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