2

I am using Centos 7 and bash. I know on some machines, if there is only one subfolder (and some files) in current folder, when you type cd <tab> it will auto-complete the name of the subfolder. However, it doesn't work on my machine, although <tab> can do other auto-completion on my machine, e.g., less ab<tab> will auto-complete the filename starting with ab. How can I fix it?

Edit:

Another working machine has same Centos and bash. On my machine, cd <tab> does nothing but a beep. For cd <tab><tab>, it shows all files and the single subfolder in current folder. The single folders on both machine are proper (command ls -ld the_single_folder shows drwxrwxr-x 2 user user ...).

Some shell options (output of command shopt) are different. The output of diff shoptA shoptB is (my machine is B):

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

I tried to change those different options (extglob and hostcomplete) on my machine using commands shopt -s extglob and shopt -u hostcomplete. But it didn't work

Command complete -p cd on that machine output complete -o nospace -F _cd cd, on my machine output -bash: complete: cd: no completion specification.

Command type _cd on that machine output:

_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
}
15
  • probably there's nothing to fix, and there's a good reason this is happening. What happens if you press <tab><tab>? Commented Jun 20, 2021 at 12:50
  • also, this might sound like a stupid question, but on these other machines, are you using the same bash? Or is it dash/zsh/something else? echo $SHELL might be a quick way of figuring out. Commented Jun 20, 2021 at 12:58
  • <tab><tab> showed all files and that subfolder on my machine, as most machines do. On another machine, it has same bash and Centos as shown by commands ps -p $$ and cat /etc/os-release. But it works well. Commented Jun 20, 2021 at 13:34
  • ok, so cd <tab><tab> in the folder you're expecting cd <tab> to work (but where it doesn't work) lists exactly one folder? Or none? Commented Jun 20, 2021 at 13:57
  • 2
    I wonder if completions for cd come with bash or you need extra package(s) maybe. Commented Jun 20, 2021 at 15:47

1 Answer 1

2

Following the link in @Kamil Maciorowski 's suggestion, I installed a package by command

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

It solved my problem. Thank you all!

You must log in to answer this question.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.