重现步骤
在 tmp 上创建目录,在里面添加 1 个文件。
mkdir /tmp/testdir && touch /tmp/testdir/examplefile
粘贴下面的脚本
/tmp/completion.sh
# BEGIN AUTOCOMPLETE function _foo_complete() { local comnum cur opts [[ "${COMP_WORDS[@]}" == *"-"* ]] && comnum=2 || comnum=1; COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" opts="--help --restart -h -r" if (( COMP_CWORD > comnum )); then COMPREPLY=( $(for filename in "/tmp/testdir/"*; do echo ${filename##*/}; done) ) return fi if [[ ${cur} == -* ]]; then COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) return 0 else COMPREPLY=( $(for filelist in /tmp/testdir/"$2"*; do echo ${filelist##*/}; done) ) fi } complete -F _foo_complete foo.sh # END AUTOCOMPLETE
那就采购吧。
. /tmp/completion.sh
预期结果
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
examplefile
$ foo.sh --restart examplefile <tab><tab>
相反会发生什么
$ foo.sh --restart examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile <tab><tab> examplefile
我希望该建议显示为可能的完成,但实际上并未完成(出于显示目的)。以前有人问过这个问题,但到目前为止还没有给出答案。
关于-o nosort
我研究了那个选项,它只在 Bash 4.4+ 上可用,我在我的 16.04 机器上试过,但它失败了。寻找更全球化的解决方案