从 PROMPT 中截断主机名部分

从 PROMPT 中截断主机名部分

我有一些属于云环境的实例。它们的名称以 UUID 为后缀,例如:

<name-of-host>-411a7a0e-b409-46a0-bf8f-546ffc50ee2b

我不想隐藏它,因为它可以帮助我知道我在哪台机器上,所以我只想看到前 20 个字符。

我的默认提示如下:

PROMPT="[%n@%m %1~]%(#.#.$) "

因此,我的第一次尝试是:

PROMPT="[%n@%20>...>%m %1~]%(#.#.$) "

然而,这并不起作用,因为它显示如下:

user@name-of-host...<command prompt is right here>

然后我尝试这样做:

PROMPT="[%n@%{%20>...>%m%} %1~]%(#.#.$) "

它正确显示提示,但是当我尝试类似 bck-i-search( CTRL-R) 的操作时,里面的部分%{...%}被覆盖。

ZSH 文档解释了原因:

%{...%}
Include a string as a literal escape sequence.  The
  string within the braces should not change the cur-
  sor position.  Brace pairs can nest.

还有其他方法可以实现我的愿望吗?

答案1

%>>您可以使用或 来结束截断 - 如“仅截断到这里” %<<

PROMPT="[%n%20>...>%m%>> %1~]%(#.#.$) "

以下是ZSH 手册

要截断的提示字符串部分运行到字符串的末尾,或者到下一个封闭组的末尾`%('构造,或在同一分组级别遇到的下一个截断(即`%('是分开的),以先到者为准。特别是,参数为零的截断(例如,`%<<') 标记要截断的字符串范围的结束,并从那里关闭截断。例如,提示`%10<...<%~%<<%# '将打印当前目录的截断表示,然后是`%'或者`#',然后是空格。没有`%<<',这两个字符将包含在要截断的字符串中。

答案2

由于主机名在各个命令之间不会改变,因此您可以将其作为文字字符串包含在 PROMPT 中,而不必使用%m

也就是说,

short_hostname="$(hostname|sed -e 's/-.*//')"
PROMPT="[%n@${short_hostname} %1~]%(#.#.$) "

相关内容