如何为 scp 启用本地〜自动完成功能?

如何为 scp 启用本地〜自动完成功能?

太晚了:有问题的机器、操作系统和配置不再使用,所以我无法验证更多建议。我在 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正常完成。

请注意: 这个问题是两者都不关于以 root 身份自动完成也不远程自动完成。 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

bashauto-completion似乎是要走的路。安装bash-completion软件包。

然后/etc/bash_completion.d/ssh是对scp命令的引用。

答案3

遇到了同样的问题(就其价值而言,在 OS X 10.11、stock 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

我还发现在末尾收缩波浪号很好,保持路径又好又短(无论如何,就像最初输入的那样)。

相关内容