符号链接循环中出现意外的bash自动完成行为

时间:2012-04-12 08:49:02

标签: bash autocomplete symlink

我有以下目录结构:

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 /).

  3. 但我不明白两者之间的实际行为。理想情况下,我希望bash表现得像2.(autocomplete to cd ../subdir/)。我正在使用fedora 14,bash版本4.1.7(1)。知道怎么做到这一点吗?

3 个答案:

答案 0 :(得分:1)

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

您可以在此处找到一些很好的基本示例: More on Using the Bash Complete Command

根据上面的链接使用函数和脚本名称,这是一个脚本,它将/附加到目录的符号链接......这只是一个粗略的示例,但它表明它可以完成(我没有尝试使用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 linkset -P; cd link

答案 1 :(得分: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无法确定这是一个目录,因此不附加最终的'/'。 描述了一个非常类似的问题here

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

答案 2 :(得分:0)

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

修改

看看这个:

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