如何通过 bash 中的自动完成功能 cd 进入唯一的子文件夹?

如何通过 bash 中的自动完成功能 cd 进入唯一的子文件夹?

我正在使用 Centos 7 和 bash。我知道在某些机器上,如果当前文件夹中只有一个子文件夹(和一些文件),当您键入时cd <tab>它会自动完成子文件夹的名称。但是,它在我的计算机上不起作用,尽管<tab>可以在我的计算机上执行其他自动完成功能,例如,less ab<tab>将自动完成以 开头的文件名ab。我该如何修复它?

编辑:

另一台工作机有相同的 Centos 和 bash。在我的机器上,cd <tab>除了嘟嘟声之外什么也没做。对于cd <tab><tab>,它显示当前文件夹中的所有文件和单个子文件夹。两台机器上的单个文件夹都是正确的(命令ls -ld the_single_folder显示drwxrwxr-x 2 user user ...)。

一些 shell 选项(命令的输出shopt)是不同的。的输出diff shoptA shoptB是(我的机器是B):

18c18
< extglob           on
---
> extglob           off
27c27
< hostcomplete      off
---
> hostcomplete      on
42a43
> syslog_history    off

shopt -s extglob我尝试使用命令和来更改我的计算机上的这些不同选项(extglob 和 hostcomplete)shopt -u hostcomplete。但没有成功

命令complete -p cd在那台机器上输出complete -o nospace -F _cd cd,在我的机器上输出-bash: complete: cd: no completion specification

type _cd该机器上的命令输出:

_cd is a function
_cd () 
{ 
    local cur prev words cword;
    _init_completion || return;
    local IFS='
' i j k;
    compopt -o filenames;
    if [[ -z "${CDPATH:-}" || "$cur" == ?(.)?(.)/* ]]; then
        _filedir -d;
        return 0;
    fi;
    local -r mark_dirs=$(_rl_enabled mark-directories && echo y);
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y);
    for i in ${CDPATH//:/'
'};
    do
        k="${#COMPREPLY[@]}";
        for j in $( compgen -d $i/$cur );
        do
            if [[ ( -n $mark_symdirs && -h $j || -n $mark_dirs && ! -h $j ) && ! -d ${j#$i/} ]]; then
                j+="/";
            fi;
            COMPREPLY[k++]=${j#$i/};
        done;
    done;
    _filedir -d;
    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]};
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/";
        fi;
    fi;
    return 0
}

答案1

下列的链接@卡米尔·马乔罗夫斯基的建议,我通过命令安装了一个包

yum --enablerepo=epel install bash-completion-extras

它解决了我的问题。谢谢你们!

相关内容