Bash에서 CDPATH를 사용하여 경로 자동 완성을 방지하시겠습니까?

Bash에서 CDPATH를 사용하여 경로 자동 완성을 방지하시겠습니까?

내 Mac에서 bash(버전 3.2.53(1))는 명령줄 인수에 파일 자동 완성을 사용합니다.오직현재 디렉토리에 있습니다.

작업 중인 Linux 시스템에서 bash(버전 4.1.2(1))는 현재 디렉터리의 파일을 사용하여 명령줄 인수를 자동 완성합니다.그리고상위 디렉토리.

예를 들어, 디렉토리 트리가 다음과 같습니다.

/home/pjl/
    bin/
    foo/
        book/

내 Mac에서는 다음을 수행합니다.

$ cd foo
$ cd b<TAB>
$ cd book

배쉬 자동 완성오직도착하다 book. 그러나 Linux 시스템에서 동일한 작업을 수행하면 다음과 같습니다.

$ cd foo
$ cd b<TAB>
bin book
$ cd b

bash는 두 가지 옵션을 제공합니다: book현재 디렉터리에서그리고 bin상위 디렉토리에서.

Bash 자동 완성을 만드는 방법오직현재 디렉토리를 사용하시겠습니까(예: 내 Mac에서)?

존재하다둘 다기계는 CDPATH다음과 같이 설정했습니다.

.:..:../..:../../..:../../../..:../../../../..:/home/pjl/src:/home/pjl

CDPATHLinux 시스템에서 설정을 해제 하면 bash는 다음을 사용하여 자동으로 수행합니다.오직현재 디렉토리(내가 원하는 것); Linux에서 bash가 CDPATH.

CDPATH그런데 어떻게 설정을 유지할 수 있나요 (so'ing은 cd이전처럼 작동합니다).아니요CDPATH자동 완성을 위해 bash를 사용합니까?


또 다른 허용되는 동작은 자동 완성입니다.호의현재 디렉토리 및 사용법CDPATH 만약에 그리고 만약에현재 디렉터리에 일치하는 항목이 없습니다.

답변1

~/.bashrc올바른 방법은 위에서 제안한 @Gilles와 같이 다음을 사용하는 것입니다(여기서는 더 짧은 버전).

_my_cd () { CDPATH= _cd "$@";}

CDPATH더 나은 접근 방식 은 로컬에서 일치하는 항목이 없는지 확인하는 것입니다 .

_my_cd () { CDPATH= _cd "$@"; if [ -z "$COMPREPLY" ]; then _cd "$@"; fi;}

이렇게 하면 번거로움 없이 프로그래밍 방식으로 수행할 수 있는 기능을 얻을 수 있습니다. 잊지 마요

complete -F _my_cd cd

/usr/share/bash-completion/bash_completion어떤 이유로든 -o nospace( 기본값인 것처럼 보이지만) 다음을 수행할 수도 있습니다 cd.nospace

complete -F _my_cd -o nospace cd

답변2

당신은 범인입니다bash_complete, 귀하의 bash 버전이 전혀 아닙니다.

그리고bash_completion 저장소의 헤드 버전, cdinclude 아래의 디렉토리를 자동으로 완성합니다 CDPATH.

local 을 직접 변경할 수 있지만 자동 완성 기능을 bash_completion직접 작성하는 것이 더 좋습니다 cd.


전역 효과를 원할 경우 /etc/bash_completion.d/cd다음 내용으로 파일을 만듭니다.

_cd()
{
    local cur=${COMP_WORDS[COMP_CWORD]}
    _init_completion || return

    local IFS=$'\n' i

    compopt -o filenames

    local -r mark_dirs=$(_rl_enabled mark-directories && echo y)
    local -r mark_symdirs=$(_rl_enabled mark-symlinked-directories && echo y)

    _filedir -d

    if [[ ${#COMPREPLY[@]} -eq 1 ]]; then
        i=${COMPREPLY[0]}
        if [[ "$i" == "$cur" && $i != "*/" ]]; then
            COMPREPLY[0]="${i}/"
        fi
    fi

    return 0
}
if shopt -q cdable_vars; then
    complete -v -F _cd -o nospace cd
else
    complete -F _cd -o nospace cd
fi

이 버전은 일부 콘텐츠를 제외하고 완전히 원본 버전에서 나온 것입니다 CDPATH.


설정에만 사용하려면 다음을 .bashrc사용하여 편집할 수 있습니다.

_my_cd () {
  declare CDPATH=
  _cd "$@" 
}

complete -F _my_cd cd

CDPATHbash_completion시스템이 너무 오래되었거나 아직 로드되지 않았기 때문에 Mac OSX에서 bash 완성이 작동하지 않는 경우가 있습니다 .

BASH_COMPLETION_COMPAT_DIR변수를 사용하여 사용자 정의 완성 기능이 로드되는 위치를 설정할 수 있습니다 . bash_completion기본값은 입니다 /etc/bash_completion.d.

관련 정보