如何防止bash自动完成尾随点?

Igo*_*nko 5 bash autocomplete

假设我有一个文件名和不同的扩展名:

test.tex
test.pdf
Run Code Online (Sandbox Code Playgroud)

只输入不带扩展名的文件名,然后输入整个文件名更容易。这是可能的,因为相应的程序知道他们需要的扩展名并自动附加它。以下示例完美运行:

tex test
pdf-viewer test
Run Code Online (Sandbox Code Playgroud)

但是在这里使用 bash 补全总是让我厌烦添加尾随点。例如:

tex te<TAB>
Run Code Online (Sandbox Code Playgroud)

变成了

tex test.
Run Code Online (Sandbox Code Playgroud)

但是应用程序会失败并报错;每次点击后我都必须按退格键<TAB>:-(

如何告诉 bash 在进行自动完成时不要添加尾随点?

Kus*_*nda 2

可能有一种更简单的方法,但这似乎有效:

texfiles () { names=( "$2"*.tex ); COMPREPLY=( "${names[@]%.tex}" ); }

complete -F texfiles tex
Run Code Online (Sandbox Code Playgroud)

首先设置一个名为 的 shell 函数texfiles。它使用第二个命令行参数($2,用户在按Tab完成该单词之前在命令行中键入的单词),并COMPREPLY使用所有匹配的名称填充数组"$2"*.tex

对于每个名称,.tex在将其添加到数组之前都会删除后缀。

然后,该complete命令用于告诉 shell专门texfiles执行该tex命令的文件名完成功能。您可以对所有应以相同方式完成文件的命令重复相同的命令。因为您可能想创建一个相应的函数(这些函数的名称是任意的)。complete.texpdf-viewerpdffiles

这就是它的实际效果(<tab>表示我按下了该Tab键):

bash-4.4$ ls -l
total 0
-rw-r--r--  1 kk  wheel  0 Sep 28 21:43 README.txt
-rw-r--r--  1 kk  wheel  0 Sep 28 21:12 file.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:24 file2.tex
-rw-r--r--  1 kk  wheel  0 Sep 28 21:25 hello.tex

bash-4.4$ tex <tab><tab>
file   file2  hello
bash-4.4$ tex

bash-4.4$ tex f<tab>ile<tab><tab>
file   file2
bash-4.4$ tex file
Run Code Online (Sandbox Code Playgroud)

ileinfile是由shell插入的)

阅读手册的“可编程完成”部分bash了解详细信息。