如何在自己的别名中镜像自动完成功能(在 14.04 中)

WBa*_*ang 6 bash alias auto-completion 14.04

我在 12.04 机器上使用了一堆别名。

例子:

alias pssh="tsocks ssh"
alias pscp="tsocks scp"
alias prdp="tsocks xfreerdp  ..........SOMETHING ...."
Run Code Online (Sandbox Code Playgroud)

这些别名是对常规 linux 命令(scp、ssh 等)的修改,因此我希望这些别名具有与其原始对应项相同的自动完成规则。我不想编写自己的规则,因为常规命令的规则非常好。

在 12.04 中,以下内容完美运行:

complete -F _ssh pssh
complete -F _scp pscp
complete -F _ssh prdp
Run Code Online (Sandbox Code Playgroud)

这在 14.04 中不起作用。如果我尝试自动完成,我会收到以下错误:

bash: completion: function `_ssh' not found
Run Code Online (Sandbox Code Playgroud)

如果我在尝试 pssh 之前在 ssh 上自动完成,一切正常。据我所知,这是因为自动完成规则在使用之前没有加载。在加载 ssh 的自动完成规则之前,我的规则无效并导致错误。

如何解决此问题,如何正确地将别名挂接到为常规 linux 命令定义的自动完成规则中?

Jav*_*pez 2

较新的 bash 完成版本 (>=2.0) 极大地缩短了加载自动完成逻辑所用的时间。他们通过根据请求加载所需的文件来制作它们,这些文件的新位置是:

/usr/share/bash-completion/completions/

如果你使用ls -lah来探索这样的目录,你会发现存在很多软链接。这是因为每个命令/别名都需要一个文件,因此,如果您有 pssh、pscp 和 prdp,则需要使用这些名称创建链接:

sudo ln -s /usr/share/bash-completion/completions/ssh /usr/share/bash-completion/completions/psss
sudo ln -s /usr/share/bash-completion/completions/ssh /usr/share/bash-completion/completions/pscp
sudo ln -s /usr/share/bash-completion/completions/ssh /usr/share/bash-completion/completions/prdp
Run Code Online (Sandbox Code Playgroud)

另一种选择是将 ssh 自动完成文件系统链接到 /etc/bash_completion.d/

sudo ln -s /usr/share/bash-completion/completions/ssh /etc/bash_completion.d/ssh
Run Code Online (Sandbox Code Playgroud)

前一种方法将在每个 bash 交互式会话上加载 _ssh 函数(使启动速度变慢)。

使用上述任何方法后,您的complete -F _ssh pssh ...配置会将 _ssh 函数与您的别名相关联。