我在 12.04 机器上使用过一些别名。
例子:
alias pssh="tsocks ssh"
alias pscp="tsocks scp"
alias prdp="tsocks xfreerdp ..........SOMETHING ...."
这些别名是常规 Linux 命令(scp、ssh 等)的修改版,因此我希望这些别名具有与原始命令相同的自动完成规则。我不想编写自己的规则,因为常规命令的规则完全没问题。
在 12.04 中,以下操作运行良好:
complete -F _ssh pssh
complete -F _scp pscp
complete -F _ssh prdp
这在 14.04 中不起作用。如果我尝试自动完成,我会收到以下错误:
bash: completion: function `_ssh' not found
如果我在尝试 pssh 之前在 ssh 上自动完成,则一切都会正常。据我所知,这是因为自动完成规则在使用前未加载。在 ssh 的自动完成规则加载之前,我的规则无效并导致错误。
我该如何解决这个问题,如何将我的别名正确地挂接到为常规 Linux 命令定义的自动完成规则中?
答案1
较新的 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
另一种方法是将 ssh 自动完成文件 syslink 到 /etc/bash_completion.d/
sudo ln -s /usr/share/bash-completion/completions/ssh /etc/bash_completion.d/ssh
前一种方法将在每一个 bash 交互会话中加载 _ssh 函数(使得启动速度变慢)。
使用上述任何一种方法后,您的complete -F _ssh pssh ...
配置都会将 _ssh 函数与您的别名关联起来。