ZSH %m 提示转义在 Debian Linux 下无法正常工作

Mur*_*iar 2 prompt zsh hostname

zshmisc我的新 Debian Squeeze 安装的手册页指出,位于SIMPLE PROMPT ESCAPES

%m
The hostname up to the first `.'. An integer may follow the '%' to specify how
many components of the hostname are desired. With a negative integer, trailing
components of the hostname are shown.
Run Code Online (Sandbox Code Playgroud)

当我包含%2m在我的提示中时,我看到 OSX 和 Linux 之间的不同行为。

在 OSX (10.7.3) 上,运行 zsh 4.3.11,提示的行为符合预期,显示系统主机名的两个主要部分。

在 Debian 上,运行 zsh 4.3.10,提示仍然只显示裸主机名。hostname -f在此系统上确认完整的主机名设置正确。另请注意,此 zsh 版本的联机帮助页表示应支持 %2m。

有没有人对从哪里开始调试这个有任何建议?

Mik*_*kel 6

快速查看 zsh 的提示处理源代码表明这%m是基于您的系统为gethostname系统调用返回的内容。这就像在hostname没有-f选择的情况下运行。

我假设在 Debian 系统上运行时hostname -f返回裸主机名?

您可以尝试更改您的主机名以包含域名。Debian HowTo/ChangeHostname 文档应该对此有所帮助。但也许某些 Debian 工具假定您的主机名不包含域名,因此这可能是一个坏主意。

仅使用命令替换可能更有意义。

首先设置 PROMPT_SUBST 选项

setopt PROMPT_SUBST
Run Code Online (Sandbox Code Playgroud)

然后你可以运行任何命令并将其输出放在提示中,如下所示:

PS1='$(hostname -f)$ '
Run Code Online (Sandbox Code Playgroud)

要仅获取主机名的第一个但很多部分,您可以使用cut,例如

PS1='$(hostname -f | cut -f 1-2 -d .)$ '
Run Code Online (Sandbox Code Playgroud)

因为你的主机名不应该改变,你也可以通过只运行一次命令并将其存储在一个变量中,然后使用该变量来提高效率,例如

HOSTANDSUBDOMAIN="$(hostname -f | cut -f 1-2 -d .)"
PS1="$HOSTANDSUBDOMAIN$ "
Run Code Online (Sandbox Code Playgroud)