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

일부 셸 옵션(명령 출력 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

다음과 같은링크존재하다@camillemachorowski제안한 대로 다음 명령을 통해 패키지를 설치했습니다.

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

그것은 내 문제를 해결했습니다. 다들 감사 해요!

관련 정보