包含目录名称的环境变量的 Bash 自动完成

Kei*_*son 10 bash autocomplete

除其他外,我在 Linux Mint 14 上使用 bash 4.2.37。

当我通过键入自动完成环境变量的名称时Tab,它会扩展为变量的名称,后跟一个空格。

如果变量的值恰好是目录名,我希望它扩展为变量名,后跟/.

例如,如果我输入:

$ ls $HOM<tab>
Run Code Online (Sandbox Code Playgroud)

它扩展为:

$ ls $HOME _
Run Code Online (Sandbox Code Playgroud)

where_标记光标的位置。问题是,我当时常常想继续我的主目录,这意味着我必须键入下键入一些文件或目录的名称backspace,然后/

所以我希望将上述内容扩展为:

$ ls $HOME/_
Run Code Online (Sandbox Code Playgroud)

当我输入整个变量名时,也会发生同样的事情;after ls $HOMEtab添加一个空格,我希望它添加一个/.

(当然,/如果变量的值不是目录名称,我不希望它添加 a 。)

有什么方法可以告诉 bash 按照我想要的方式行事,无论是通过 bash 命令还是更新我的$HOME/.inputrc?

注意:我正在专门寻找一种方法来tab按照我想要的方式行事。用不同的击键实现相同行为的方法会很有趣,但不会回答我的问题。

(我/etc/profile.d/bash_completion.sh在我的系统上禁用了,因为它与 交互很差set -o nounset。一个快速的实验表明这可能与我的问题无关。)

顺便提一下,tcsh 是这样做的:给定一个环境变量$FOOBAR,如果它指的是一个目录,则输入$FOOBA<tab>扩展为(带空格)如果不是。不,这还不足以说服我回到 tcsh。zsh 也这样做。$FOOBAR/$FOOBAR

car*_*est 7

shopt -s direxpand
Run Code Online (Sandbox Code Playgroud)

会有所帮助,将没有空间,因此您可以继续输入,但它将用其内容替换环境变量。

另见/sf/ask/449294541/


Kei*_*son 6

此功能在 2014-02-26 发布的 bash 4.3 中实现。

引用NEWS文件(包含在 的顶层bash-4.3.tar.gz,另见GPG 签名):

单词完成代码检查包含 shell 变量的文件名是否扩展为目录名并/适当地附加到单词。执行命令完成时,相同的代码扩展命令名称中的 shell 变量。

对从源代码构建的副本进行的快速实验表明,如果我键入

$ ls $HOM<tab>
Run Code Online (Sandbox Code Playgroud)

它现在扩展到

$ ls $HOME/
Run Code Online (Sandbox Code Playgroud)

(顺便说一句, zsh 也这样做。)