Bash 완성은 현재 단어를 포함합니다.

Bash 완성은 현재 단어를 포함합니다.

내 명령에 대한 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에 있는 대부분의 프로그램은 _filedirbash-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.

관련 정보