5

我有以下目录结构:

base/
  dir/
    subdir/
    link -> ../dir

现在,如果我 cd 到 dir/link 并键入:

cd ../subd[tab]

我得到:

cd ../subdir[space] 
  1. 如果自动完成失败,我会理解(因为它会规范路径并查看 base/ 而不是 dir/)。

  2. 我也会理解它是否cd ../subdir/会以 / 结尾自动完成(因为它会解释..go up one level并搜索到 dir/)。

但我不明白介于两者之间的实际行为。理想情况下,我希望 bash 表现得像 2.(自动完成到 cd ../subdir/)。我正在使用 Fedora 14,bash 版本 4.1.7(1)。知道如何做到这一点吗?

4

3 回答 3

1

更新:您可以自定义自动完成的程序称为complete.

你可以在这里找到一些很好的基本示例:更多关于使用 Bash Complete 命令

根据上面的链接使用函数和脚本名称,这是一个脚本,它附加/到目录的符号链接......这只是一个粗略的示例,但它表明它可以完成(我没有尝试过内置cd...

将函数_mycomplete_与可执行文件关联myfoo

complete -F _mycomplete_ myfoo

进入的功能~/.bashrc

function _mycomplete_()
{
    local cmd="${1##*/}"
    local word=${COMP_WORDS[COMP_CWORD]}
    local line=${COMP_LINE}
    local xpat='!*.foo'

    COMPREPLY=($(compgen -f -X "$xpat" -- "${word}"))
    if ((${#COMPREPLY[@]}==1)) ;then
       [[ -h $COMPREPLY ]] && COMPREPLY="$COMPREPLY/"
    fi
}

原答案:

在命令行中,自动扩展为符号链接的主要指标显示在下表的最后一行,即。名称扩展但没有最终的/

 on pressing TAB                                         on pressing TAB (again)  
  what happens?              meaning                        what happens?
===================      =======================     ==================================== 
Nothing is appended  1=> Multiple sub-dirs exist  => A list of possibilities is presented
                     2=> No sub-directory exists  => Nothing is appended (again)

Expands to end in /   => A uniquely matching dir  => ...as per first column (repeat)
Expands text only     => Current name is a link   => Expands to end in /

在您的示例中,如果您已经将命令行设置为全名,即。cd link那么指标就不明显了。此外,您不会通过可能性列表知道它是一个符号链接。

为了能够到达cd链接的目标,您可以使用cd -P link, 或set -P; cd link

于 2012-04-12T11:47:35.480 回答
0

稍微挖掘一下源代码后,看起来这有点复杂。实际问题是 bash 允许在工作目录中使用符号链接(请参阅 pwd -L 和 pwd -P)和 readline 无法确定匹配类型(如果它不在物理目录中)之间的混合

readline/complete.c:1694

s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0)
? LSTAT (filename, &finfo)
: stat (filename, &finfo);

stat() 失败,因为 ../ 被理解为相对于物理路径而不是逻辑路径。readline 无法确定这是一个目录,因此不会附加最后的“/”。这里描述了一个非常相似的问题

所以我想我现在可以忍受现有的行为......

于 2012-04-13T16:14:05.557 回答
0

我在 Ubuntu 中遇到了完全相同的问题。自动补全就像您的示例 #2 一样工作,但在某些时候开始按照您的描述工作。我清除并重新安装了 bash-completion 包,现在一切似乎恢复正常。不要卸载 bash!只有 bash 自动完成。

编辑

看这个:

https://bbs.archlinux.org/viewtopic.php?id=113158

于 2012-05-14T23:59:51.643 回答