내 명령에 대한 bash 완성 스크립트를 만들려고 합니다. ls
내가 원하는 행동이 있습니다. 내 명령에서도 동일한 동작이 필요합니다.
이게 내가 얻은 거야ls
$ ls /home/tux/<Tab><Tab>
Downloads Documents Pictures
$ ls /home/tux/Do<Tab><Tab>
Downloads Documents
즉, bash는 절대 경로가 아닌 상대 경로만 표시합니다(즉, Downloads
완성 목록에 추가되지만 그렇지 않습니다 /home/tux/Downloads
).
같은 방식으로 작동하는 완성 스크립트를 작성하고 싶습니다. 내가 시도한 것은 다음과 같습니다.
_testcommand ()
{
local IFS=$'\n'
local cur=${COMP_WORDS[COMP_CWORD]}
COMPREPLY=( $(compgen -o bashdefault -d -- "$cur") )
if [ "${#COMPREPLY[@]}" -ne 1 ]
then
# remove prefix "$cur", so the preview of paths gets shorter
local cur_len=$(echo $cur | sed 's|/[^/]*$||' | wc -c)
for i in ${!COMPREPLY[@]}
do
COMPREPLY[$i]="${COMPREPLY[i]:$cur_len}"
done
fi
return 0
}
complete -o nospace -F _testcommand testcommand
그런데 결과는 이렇습니다.
$ testcommand /home/tux/<Tab><Tab>
Downloads Documents Pictures
$ testcommand /home/tux/Do<Tab>
Downloads Documents
$ testcommand Do
내 일을 어떻게 끝낼 수 있나요?아니요/home/tux/
명령줄에서 삭제하시겠습니까?
complete
참고: 하단 호출에 "-f" 또는 "-d" 등을 추가 할 수는 없는 것 같습니다 . 실제로 어떤 경우에는 완성이 길보다는 단어를 완성해야 할 때도 있습니다.
답변1
"ls": 를 통해 어떤 완성 기능이 사용되는지 확인할 수 있습니다 complete -p | grep ls
. 다음 명령을 사용하여 이 기능을 확인할 수 있습니다. ( type _longopt
이전 명령의 결과) 함수 에서 함수 _longopt
를 찾을 수 있습니다 _filedir
.
마지막으로 마무리에 관한 흥미로운 기사입니다.https://spin.atomicobject.com/2016/02/14/bash-programmable-completion/
답변2
bash 완성 디렉터리( ) pkg-config --variable=completionsdir bash-completion
에 있는 대부분의 프로그램은 _filedir
bash-completion 자체에서 제공하는 기능을 사용합니다. 재사용은 합법적인 것 같습니다 _filedir
. 자체 구현에 대해 걱정할 필요가 없습니다!
추적 요소:
_testcommand()
{
# init bash-completion's stuff
_init_completion || return
# fill COMPREPLY using bash-completion's routine
# in this case, accept only MarkDown and C files
_filedir '@(md|c)'
}
complete -F _testcommand testcommand
물론 파일이 아닌 항목을 완료할 때에도 사용할 수 있습니다.
if ...
then
# any custom extensions, e.g. words, numbers etc
COMPREPLY=( $(compgen ...) )
else
# fill COMPREPLY using bash-completion's routine
_filedir '@(md|c)'
fi
어떻게 찾았나요?
감사해요@csm: 대답을 사용하여 type _longopt
어느 것이 호출되는지 확인하십시오 _filedir
.