我正在为 Bash 编写一个制表符补全脚本,使用 Python 来提供补全结果。我正在使用虚拟脚本来显示我遇到的问题,内容并不重要。
我有一个名为 的 Bash 脚本dothat,其中包含以下代码:
var=$1
echo "You have chosen $var"
Run Code Online (Sandbox Code Playgroud)
我还有一个为 创建制表符完成的脚本dothat,称为dothat-completion.bash:
_comp_func()
{
COMPREPLY=()
# Gets the output of a Python file and puts it into a variable
fruits=$(python fruit.py)
COMPREPLY=($(compgen -W "${fruits[*]}" -- $cur))
}
complete -F _comp_func dothat
Run Code Online (Sandbox Code Playgroud)
以及(简单)内容fruit.py:
print('fruit:', end='')
Run Code Online (Sandbox Code Playgroud)
Python 脚本只是将字符串打印到 STDOUT,然后由 Bash 补全函数捕获该字符串,并用于生成制表符补全的可能匹配项。
现在,我想用这个脚本做的是,当我输入 时dothat <TAB>,它将完成到dothat fruit:,末尾没有空格。问题是,当我键入dothat 并按 Tab 时,它会完成为dothat fruit: ,并带有不需要的尾随空格。
我尝试将Python的内容更改为以下内容,并且所有结果都相同:
print('"fruit:"', end='') …Run Code Online (Sandbox Code Playgroud) 我知道这!用于否定 Bash 中的 if 条件,但我刚刚看到采用以下格式的代码:
if ! [[ CONDITION ]]; then
SOMETHING
fi
Run Code Online (Sandbox Code Playgroud)
这种格式和下面的格式有区别吗?
if [[ ! CONDITION ]]; then
SOMETHING
fi
Run Code Online (Sandbox Code Playgroud)
我试过谷歌,但还没有找到任何关于以前的语法。
我最近发现不能将空字符串传递给 Bash 数组。这很棘手,因为我试图将空字符串值插入到数组中。
然而,我注意到 Bash 完成变量 COMP_WORDS 可以包含空值。
我编写了一个虚拟完成脚本来说明这一点,并启用了调试选项:
1 #!/bin/bash
2 _comp() {
3 set -xv
4 for i in ${!COMP_WORDS[@]}; do
5 echo "<${COMP_WORDS[$i]}>"
6 done
7 set +xv
8 local cur=${COMP_WORDS[$COMP_CWORD]}
9
10 local arr=(apple banana mango pineapple)
11 COMPREPLY=()
12 COMPREPLY=($(compgen -W "${arr[*]}" -- $cur))
13
14 }
15
16 complete -F _comp dummy
Run Code Online (Sandbox Code Playgroud)
如果我获取该文件,然后输入以下内容:
dummy apple banana
Run Code Online (Sandbox Code Playgroud)
然后,如果我将光标移回苹果和香蕉之间的中间空间(下面用下划线表示)...
dummy apple _ banana
Run Code Online (Sandbox Code Playgroud)
然后,如果我点击选项卡,我会从生成的调试中得到以下输出,显示四个数组元素,“虚拟”“苹果”“香蕉”
for i in '${!COMP_WORDS[@]}'
+ echo '<dummy>'
<dummy>
+ for …Run Code Online (Sandbox Code Playgroud)