--arg
인수를 인식하고 구성 할 수 있는 bash 완성 스크립트를 만들고 싶습니다 --some-arg=file
.
읽고 나서이 튜토리얼의 몇 가지 예와 함께 /usr/share/bash_completion/completions/
다음 스크립트를 작성했습니다(Chromium을 사용하여 일부 플래그를 입력하는 시간을 절약하기 위해).
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=file
if [[ ${cur} == "--"*"=" ]] ; then
# Removed failures (is my logic OK?)
return 0
fi
# Handle other options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _chromium chromium
에 저장 ~/bash_completions/chromium
하고 를 사용하여 심볼릭 링크를 만들었습니다 sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
그런 다음 . /usr/share/bash_completions/completions/chromium
.
이제 두 가지 문제가 있습니다.
chromium --u<TAB>
chromium --user-data-dir=<SPACE>
(이 공간을 원하지 않음) 으로 확장합니다 .- 경로(디렉터리 및 파일)가 더 이상 완전하지 않습니다.
이러한 문제를 어떻게 해결할 수 있습니까?
답변1
두 가지 문제에 대한 해결책을 찾았습니다!
공백을 추가하지 않으려면 이
nospace
옵션을 사용하십시오. 이 작업은 두 가지 방법으로 수행할 수 있습니다.- 다음 주소로 전달하세요
complete
.
complete -o nospace -F _chromium chromium
compopt
내장 사용 : (
compopt -o nospace
이 옵션 활성화)
compopt +o nospace
(이 옵션 비활성화)
나는 gnu.org의 Bash 문서에서 이것을 찾았습니다.8.7 내장 기능의 프로그래밍 가능한 완성.
- 다음 주소로 전달하세요
- 문서를 완성하세요.
- Peterv가 제안한
-f
와 함께 로고를 사용하세요compgen
. 나는 그 조언을 따라 그것을COMPREPLY=( $(compgen -f "$cur") )
.
스택 오버플로에서 찾았습니다.이 답변완성 목록을 수동으로 생성하는 것이 좋습니다(사용하지 않음compgen
). 이 방법은 매우 효과적입니다. - 이
filenames
옵션을 사용하면 Readline compspec이 다음을 수행할 수 있도록 파일 이름을 생성하도록 지시합니다.- 파일 이름별 처리 수행(디렉터리 이름에 슬래시 추가, 특수 문자 인용, 후행 공백 억제 등)
- 다양한 색상을 사용하여 파일 형식 표시(
colored-stats
활성화)
- Peterv가 제안한
의 도움으로Bash의 문자열 작업(공백을 확장 ~
하고 처리하기 위해) 질문에 명시된 모든 기준을 충족하는 bash 완성 스크립트를 만들었습니다.
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=
if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
compopt -o filenames
COMPREPLY=(*)
return 0
fi
# Handle --xxxxx=path
if [[ ${prev} == '=' ]] ; then
# Unescape space
cur=${cur//\\ / }
# Expand tilder to $HOME
[[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
# Show completion if path exist (and escape spaces)
compopt -o filenames
local files=("${cur}"*)
[[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
return 0
fi
# Handle other options
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
# If there's only one option, without =, then allow a space
compopt +o nospace
fi
return 0
}
complete -o nospace -F _chromium chromium
답변2
-f
파일 이름을 완성하려면 에 전달해 보세요 compgen
.
옵션 뒤의 공백을 제거할 수 없을까 걱정됩니다. 완성이 작동하는 방식이기 때문입니다. 고유한 일치 항목을 찾으면 완전히 완료됩니다.