gpt4 book ai didi

具有等号和可枚举标志值的 Bash 完成

转载 作者:行者123 更新时间:2023-12-04 06:34:03 27 4
gpt4 key购买 nike

我正在尝试构建一个 bash 完成例程,它将建议命令行标志和合适的标志值。例如在下面 fstcompose 命令我想比赛套路先建议 compose_filter= 标志,然后建议来自 [alt_sequence, auto, match, sequence] 的可能值。

fstcompose --compose_filter=

对于没有一组关联值的任何标志,我希望比赛退回到建议路径或文件的默认模式。

我面临的一个问题是 = 等号被视为单个标记并设置为上一个 COMP_WORD。是否有一种技术可以在包含前一个 = 字符之前检测整个标志?或者有没有更好的方法来实现带有可枚举值的标志的这种类型的完成?下面是我正在使用的完成例程的示例。
_fstcompose()
{
local cur prev opts filters pprev
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
opts="--compose_filter= --connect"
filters="alt_sequence auto match sequence"

if [[ ${cur} == -* ]] ; then
COMPREPLY=($(compgen -W "${opts}" -- ${cur}))
return 0
fi

if [[ ${prev} == "--compose_filter=" ]] ; then
COMPREPLY=($(compgen -W "${filters}" -- ${cur}))
return 0
fi
_filedir
}
complete -o nospace -F _fstcompose fstcompose

最佳答案

您的第一个 return 0防止第二个 if从被评估。尝试使用 case从最具体到最不具体的语句或至少订购您的 if那样的陈述。

由于“=”包含在 $COMP_WORDBREAKS 中, ${prev}是没有“=”的“--compose_filter”。

如果您从 $COMP_WORDBREAKS 中删除“=”然后 --compose_filter还在${cur}而不是 ${prev} .这样做而不保留和恢复其值(value)将破坏其他完成。

我不确定可能还有什么其他问题。

你可以用 echo 为你的函数增添色彩重定向到另一个终端以帮助调试的语句。例如:

echo "cur: $cur, prev: $prev" > /dev/pts/2

关于具有等号和可枚举标志值的 Bash 完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5040883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com