我有以下目录结构:
base/
dir/
subdir/
link -> ../dir
现在,如果我cd到dir / link并输入:
cd ../subd[tab]
我明白了:
cd ../subdir[space]
我会理解自动填充是否失败(因为它会封装路径并查看base /而不是dir /)。
我也会理解它是否自动填充到cd ../subdir/
结尾/(因为它会将..
解释为go up one level
并搜索到dir /).
但我不明白两者之间的实际行为。理想情况下,我希望bash表现得像2.(autocomplete to cd ../subdir/)。我正在使用fedora 14,bash版本4.1.7(1)。知道怎么做到这一点吗?
答案 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 link
或set -P; cd link
答案 1 :(得分:0)
稍微挖掘一下源代码后,看起来这有点复杂。实际问题是bash允许在工作目录中使用符号链接(参见pwd -L和pwd -P),如果匹配不在物理目录中,则readline无法确定匹配的类型
中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。
修改
看看这个: