【发布时间】:2021-12-31 03:52:50
【问题描述】:
重现步骤
-
在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
我希望建议显示为可能的完成,但实际上并未完成(出于显示目的)。这个问题已经被问到before,但到目前为止还没有给出答案。
关于-o nosort
我研究了该选项,它仅适用于 Bash 4.4+,我在 16.04 机器上尝试过,但失败了。寻找更多全球ish解决方案
【问题讨论】:
-
您是否希望它总是只列出当前目录中的所有文件?即如果你输入
./myscript /usr/bin<<tab><tab>,它不应该列出/usr或/usr/bin,而是当前目录? -
@root 我已经更新了这个问题。创建完成文件以仅从硬编码目录中获取文件。
-
@pynexj 已编辑,感谢您指出这一点。
-
为什么在这个问题上有赏金? @pynexj hack 为
COMPREPLY添加一个空白(也可以是空字符串'')应该足够好,不是吗? -
@Frevadona 我忘了提,
-o nosort仅适用于 Bash 4.4+,我在 16.04 机器上尝试过,但它失败了。寻找更多“全球”的解决方案。
标签: bash autocomplete compgen