scp에 대해 local~autocomplete를 활성화하는 방법은 무엇입니까?

scp에 대해 local~autocomplete를 활성화하는 방법은 무엇입니까?

너무 늦었습니다. 문제의 머신, 운영 체제 및 구성이 더 이상 사용되지 않으므로 추가 제안을 확인할 수 없습니다. Fedora나 Arch Linux에서는 이 문제가 발생하지 않았습니다. 만약에이 문제가 발생하면 다른 질문을 게시하고 구성 세부정보를 제공해 주세요.

홈 디렉터리에서 파일을 복사하려고 할 때마다 다음 문제에 직면하게 됩니다. (물결표)로 시작하는 경로는 scp자동 완성되지 않습니다 . 두 번 ~입력 하고 누르면 scp ~/이를 확인하는 것이 매우 간단합니다 Tab. 파일 완성이 표시되지 않습니다. 예를 들어 고유한 경로 접두사를 지정하더라도 scp ~/.bash_hist완료되지 않습니다. 이는 의도적으로 설계된 것입니까, 구성 가능한 것입니까, 아니면 버그입니까?

명확히 하기 위해 작업을 완료하는 다른 모든 부분(원격 호스트의 호스트 이름과 경로)은 모두 잘 수행되었습니다. 물결표를 사용하여 경로를 완성하는 것은 와 같은 다른 명령에서도 작동합니다 ls.

비표준 과제를 완료하는 데 제한이 있나요 ~? 내 것은 /home/users/username다른 호스트에 대한 NFS 3 마운트를 가리키고 있습니다( /home/username브라우저 프로필과 같이 속도가 중요한 항목을 위해). 나는 $HOME( /home/users/username)이나 다른 이상한 것을 바꾸지 않았습니다 .

Fedora 19에서는 작동합니다. Tab결과는 다음에서 완료됩니다 .scp ~/foo바꾸다그런 ~다음 /home/username정상적으로 완료됩니다.

참고하세요: 질문은 ~이야어느 것도 아니다루트로 자동 완성 정보...도 아니다원격으로 자동으로 수행됩니다. Bash는 설치가 완료된 후 제대로 작동합니다.

openssh-client 1:5.9p1-5ubuntu1 및 GNU bash 버전 4.2.24(1)-release(x86_64-pc-linux-gnu) 실행

답변1

Debian Lenny에서 작업할 때 다음을 수행하십시오:

apt-get install bash-completion

그런 다음 ~/.bash_profile을 사용하여 로컬로 활성화하거나 /etc/profile을 사용하여 시스템 전체에 추가합니다. 다음을 붙여넣습니다.

if [ -f /etc/bash_completion ]; then
 . /etc/bash_completion
fi

답변2

bash가 auto-completion갈 길인 것 같습니다. bash-completion패키지를 설치합니다 .

그런 다음 명령에 대한 참조 /etc/bash_completion.d/ssh가 나옵니다 .scp

답변3

동일한 문제가 발생했습니다 (가치가 있는 OS X 10.11, 스톡 bash 3.2.57, Brew를 통한 bash-completion 1.3). 다음과 같은이 팁SSH 완료 파일에서 물결표( /usr/local/etc/bash_completion.d/ssh내 경우 또는 /etc/bash_completion.d/ssh다른 경우) 를 다음과 같이 확장했습니다.

_scp_local_files()
{
    local IFS=$'\n'

    local dirsonly=false
    if [ "$1" = -d ]; then
        dirsonly=true
        shift
    fi

    cur="${cur/#\~/$HOME}" # <<< Expand tilde

    if $dirsonly ; then
        COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | \
            sed -e "s/$_scp_path_esc/\\\\&/g" -e '/[^\/]$/d' -e "s/^/$1/") )
    else
        COMPREPLY=( "${COMPREPLY[@]}" $( command ls -aF1d $cur* 2>/dev/null | \
            sed -e "s/$_scp_path_esc/\\\\&/g" -e 's/[*@|=]$//g' \
            -e 's/[^\/]$/& /g' -e "s/^/$1/") )
    fi

    COMPREPLY="${COMPREPLY/#$HOME/~}" # <<< Contract tilde

또한 경로를 멋지고 짧게 유지하면서(어쨌든 원래 입력한 대로) 마지막에 물결표를 줄이는 것이 좋다고 생각합니다.

관련 정보