我有以下目录结构:

/home/tichy/xxx/yyy/aaa
/home/tichy/xxx/yyy/aab
/home/tichy/xxx/yyy/aac

我想输入cdw y 并得到cdw yyy/作为结果,所以我可以添加cdw yyy/a 并得到cdw yyy/aa

我想出的解决方案为我提供了以下内容:
cdw y => cdw yyy

到目前为止,下面的代码:
_cdw () {
    local cur prev dirs
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    COMPREPLY=($(compgen -d -- /home/tichy/xxx/${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    # no difference, a bit more logical:
    dirs=$(compgen -o nospace -d /home/tichy/xxx/${cur}|perl -pe 's/{^/home/tichy/xxx/}{}')
    COMPREPLY=($(compgen -d -W ${dir} ${cur}|perl -pe 's{^/home/tichy/xxx/}{}'))
    return 0
}
complete -F _cdw cdw
cdw () {
    cd /home/tichy/xxx/$@
}

任何想法出什么事了吗?在我看来,完成过程似乎已经完成,并且不希望有更多的输入。

最佳答案

这样的事情怎么样:

COMPREPLY=( $(cdw; compgen -W "$(for d in ${cur}* ${cur}*/*; do [[ -d "$d" ]] && echo $d/; done)" -- ${cur}) )

(我不确定是否可以从此处调用shell函数,否则可能需要重复一点。)

这也摆脱了您的perl hack :-)

10-08 17:41