为什么 bash“complete”命令在 ~/.bash_profile 中不起作用?

为什么 bash“complete”命令在 ~/.bash_profile 中不起作用?

背景情况:我希望 OS X 终端上的 ssh 命令能够用制表符补全我经常使用的主机名。在 Ubuntu 上,ssh 似乎足够智能,能够用制表符补全我 ~/.ssh/config 文件中的任何主机名。但 OS X 似乎没有这种行为,所以我试图手动强制对我经常使用的某些主机进行制表符补全。

如果我打开一个终端并运行这个:

$ complete -W foo.com ssh

然后输入ssh f<tab>将完成ssh foo.com

问题:当我将这样的命令放入我的 ~/.bash_profile 中时,它不再起作用。为什么?

我确信 ~/.bash_profile 正在执行,因为其中还有其他内容(提示配置等)正在我的终端会话中生效。

将内容放入我的 ~/.bash_profile 中难道不应该等同于在会话启动时在终端中自动执行这些命令吗?就好像命令在complete丢失的上下文中运行,而其他内容仍然存在(例如我的 PS1 提示设置)。

谢谢您的见解,bash 专家!

更新

使用 complete 列出我的配置,我发现了我的错误。我使用了多个语句,例如:

complete -W foo.com ssh; complete -W bar.com ssh

并且只有最后一个才会生效(每个都会替换它之前的那个)。因此,我需要将它们全部放在一个命令中,即:

complete -W 'foo bar' ssh

所以这个问题不是关于~/.bash_profile,而是关于理解正确使用“complete”的方法

答案1

如果你尝试以下操作,将会发生什么情况:

complete | grep ssh

有条目出现吗?

我建议安装bash 完成包裹。

相关内容