太晚了:有问题的机器、操作系统和配置不再使用,所以我无法验证更多建议。我在 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
我还发现在末尾收缩波浪号很好,保持路径又好又短(无论如何,就像最初输入的那样)。