gpt4 book ai didi

bash - 防止 bash 完成两次打印回复

转载 作者:行者123 更新时间:2023-12-03 19:34:22 25 4
gpt4 key购买 nike

我很难让我的 bash 完成脚本按预期运行。

下面是我正在尝试做的最简化的版本,以及问题的截屏。

一切都很好,除了一种情况:

当完成中只有一个匹配时,当我按两次 Tab 时,它会打印两次相同的命令,这不是预期的效果。

在我的完成案例中,我只对完成第一个参数(即“子命令”)感兴趣。我以为if [ "$#" -gt "2" ]下面的行应该可以防止这种情况,但它没有 - 因为 COMP_LINE在第一个选项卡之后仍未更新。

#!/usr/bin/env bash

send_completions() {
if [[ -z "$COMP_LINE" ]]; then
return
fi

set $COMP_LINE

if [ "$#" -gt "2" ]; then
return
fi

compgen -W "one two test" "$2"
}

send_completions

通过运行启用完成:
$ complete -C './complete.sh' asd

然后输入 asd o<tab><tab>看到问题。

screencast

任何帮助表示赞赏。

最佳答案

检查 COMP_LINE 的值在这个非常时刻:

$ asd one <TAB>

您会注意到该值是:
declare -x COMP_LINE="asd one "

在您发出 set 后,这将导致两个位置参数。并且您的情况不会被触发。尝试输入其他字符: $ asd one o<TAB>你会看到你的条件会被正确触发,什么都不会完成。

我见过的大多数完成都是使用函数完成的。事实上,现在检查我系统上定义的所有补全(大多数是默认的), 其中一些是使用脚本完成的。

使用函数有一些好处,例如 COMP_WORDS数组 尊重 引号。您的脚本可以大致像这样重写:
_asd_comp() {
(( COMP_CWORD > 1 )) && return
local cur=${COMP_WORDS[COMP_CWORD]} IFS=$' \t\n'
COMPREPLY=( $(compgen -W "one two three" -- "$cur") )
}

complete -o bashdefault -o default -F _asd_comp asd

我添加了 -o选项,以便在第一个参数之后执行默认完成。您可以在 manual 中阅读更多相关信息。 .

关于如何更改脚本,唯一想到的是,我想您可以添加相当不干净的条件,例如:
(( $# > 1 )) && [[ ${COMP_LINE: -1} = " " ]] && return

关于bash - 防止 bash 完成两次打印回复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51324984/

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