Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
仅向用户显示COMPREPLY bash完成选项的子字符串_Bash_Bash Completion - Fatal编程技术网

仅向用户显示COMPREPLY bash完成选项的子字符串

仅向用户显示COMPREPLY bash完成选项的子字符串,bash,bash-completion,Bash,Bash Completion,在bash完成脚本中,假设COMPREPLY=(aa/ba/aa/bb/)。调用脚本时,完成选项在用户看来如下所示: $ foo aa/b<TAB> aa/ba/ aa/bb/ $foo aa/b aa/ba/ aa/bb/ 但是,我希望对这些选项的显示方式有更多的控制。特别是,我只想向用户显示每个COMPREPLY选项的子字符串,类似于bash now中目录完成的工作方式: $ foo aa/b<TAB> ba/ bb/ $foo aa/b ba/ bb/ 在b

在bash完成脚本中,假设
COMPREPLY=(aa/ba/aa/bb/)
。调用脚本时,完成选项在用户看来如下所示:

$ foo aa/b<TAB>
aa/ba/
aa/bb/
$foo aa/b
aa/ba/
aa/bb/
但是,我希望对这些选项的显示方式有更多的控制。特别是,我只想向用户显示每个COMPREPLY选项的子字符串,类似于bash now中目录完成的工作方式:

$ foo aa/b<TAB>
ba/
bb/
$foo aa/b
ba/
bb/

在bash中有什么方法可以做到这一点吗?

这段取自debian sid/etc/bash_completion的代码应该有助于:

# Remove colon-word prefix from COMPREPLY items
local colon_word=${1%${1##*:}}
local i=${#COMPREPLY[*]}
while [ $((--i)) -ge 0 ]; do
    COMPREPLY[$i]=${COMPREPLY[$i]#"$colon_word"}
done

我也遇到了同样的问题,我通过调整如何将完成函数绑定到命令来修复它。我知道这在处理文件系统中的实际文件时是有效的,我认为它可以处理任何类型的文件路径,比如选项,但我不确定

之前:

complete -F _fubar fubar
之后:

complete -o filenames -F _fubar fubar

有关更多详细信息:

谢谢enzotib。不幸的是,这种技术不起作用,因为这样子字符串将替换整个完成。也就是说,
fooa/b
变成了
fooba/
:-(太棒了!现在我只需要弄清楚如何在我的函数中有选择地打开/关闭不同
情况下的选项,而不使用
compopt