2012-04-12 30 views
4

我有以下目录结构:意外bash的自动完成功能的行为

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

现在,如果我cd到目录/链路和类型:

cd ../subd[tab] 

我得到:

cd ../subdir[space] 
  1. 我会理解自动完成是否失败(b因为它会封锁路径并查看base /而不是dir /)。

  2. 我也明白,如果它自动填充到cd ../subdir/与结局/(因为这将解释..go up one level和搜索到DIR /)。

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

+1

谷歌搜索 “的bash自动完成符号链接目录” 认定:http://unix.stackexchange.com/questions/14337/why-is- bash完成符号链接不同于目录http://superuser.com/questions/155167/tab-completion-with-directories-links http://superuser.com/questions/271626/ bash-autocomplete -symlink-to-directory-complete-to-whole-directory-including – huon 2012-04-12 08:56:50

+0

第一个链接是关于find,而不是bash autocompletion。 第二个链接是关于自动完成符号链接。这不是我的情况,因为subdir是一个常规目录。另外我想我已经把mark-symlinked-directories设置为已经输入'cd li [tab]'autocompletes to'cd link /' 这些链接都没有告诉我如何完成到'cd ../ subdir /' – mbonnin 2012-04-12 09:42:24

回答

0

挖的源代码位后,看起来这是一个有点复杂。实际的问题是bash的允许工作目录中的符号链接(见PWD -L和pwd -P)之间的混合,如果它不是一个物理目录

readline/complete.c:1694

的ReadLine不能确定匹配的类型
s = (nontrivial_match && rl_completion_mark_symlink_dirs == 0) 
? LSTAT (filename, &finfo) 
: stat (filename, &finfo); 

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

所以我想我可以用现有的行为生活现在...

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 link,或set -P; cd link

+0

你从哪里得到桌子?它是在bash手册中记录的,还是您从经验中获得的?关于lcd()命令,我并不真的需要这个。我想要的是自动完成将结尾'/'。 – mbonnin 2012-04-12 12:13:41

+0

我刚才注意到的一件奇怪的事情是'cd ../ dir'和'cd ../ subdir'都可以工作!看起来很奇怪...... – mbonnin 2012-04-12 12:14:20

+0

我似乎是你所需要的'完整的'...我以前没有用过它,但它肯定允许定制......我已经添加了一个链接.. – 2012-04-12 15:30:00

0

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

编辑

看看这个:

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

+0

我怀疑这是同样的问题我没有安装bash完成程序,而且我描述的问题非常特定于符号链接和内部readline完成 – mbonnin 2012-05-16 07:43:53