Bash补全函数中一些常见变量的作用域和来源

Bash补全函数中一些常见变量的作用域和来源

有 cur、prev、split、words 和 cword 等变量。它们似乎具有我可以在完成功能中使用的价值。它们在哪里定义和分配?它们出口到某个地方吗?我应该在完成中将这些变量声明为具有相同名称的本地变量吗?

答案1

如果您使用预定义函数_init_completion(其声明可以像)在我的完成函数中,您应该将某些变量声明为局部变量。

引用上面的声明_init_completion

# Initialize completion and deal with various general things: do file
# and variable completion where appropriate, and adjust prev, words,
# and cword as if no redirections exist so that completions do not
# need to deal with them.  Before calling this function, make sure
# cur, prev, words, and cword are local, ditto split if you use -s.

也许最好声明words为本地数组,因为它被用作数组。如果您使用其他此类函数,您可能需要声明一些其他变量;我认为最好检查一下代码是否需要什么。

在 Bash 中测试变量作用域:

如果我local在函数中使用a

(
    x=1
    (
        unset -v x
        b() { echo $x; x=b; }
        a() { local x=a; b; echo $x; }
        a
        if [[ ${x+x} ]]; then
            echo $x
        else
            echo 'x is unset'
        fi
    )
    echo $x
)

输出是

a
b
x is unset
1

但如果我不在local函数中使用a

(
    x=1
    (
        unset -v x
        b() { echo $x; x=b; }
        a() { x=a; b; echo $x; }
        a
        if [[ ${x+x} ]]; then
            echo $x
        else
            echo 'x is unset'
        fi
    )
    echo $x
)

输出是

a
b
b
1

即该值可供 的调用者使用a

相关内容