【问题标题】:bash prompt: highlight command being enteredbash 提示:突出显示正在输入的命令
【发布时间】:2019-02-17 08:31:38
【问题描述】:

在 bash 上输入命令如下:

<Prompt $>  <The Command I Entered>
<Output Of The Command>

我正在寻找使The Command I Entered 加粗的方法。 在 PS1 中输入 tput bold 即可轻松从提示开始粗体。

但是问题是,当按下Enter 时如何tput sgr0 它。 我可以使用 readline / bash 魔法来实现这一点吗?

【问题讨论】:

  • 您可以将环境变量PROMPT_COMMAND 设置为tput sgr0,它将在命令之后和显示每个提示之前执行。
  • 在显示命令输出之前不会执行。

标签: bash prompt


【解决方案1】:

预 Bash 4.4:

在 bash 4.3.x(可能更早的版本)中,“调试陷阱”在执行命令行命令之前执行。

trap 'tput sgr0' DEBUG

但这有一个缺点:它在执行每个简单命令之前执行。所以如果你运行:

$ echo Hello && echo World 

调试陷阱被调用两次。

那么以下命令将不会按预期工作:

tput setaf 1 ; echo "This is red"

打印出来的“这是红色的”不会是红色的。

请参阅DEBUG trap and PROMPT_COMMAND in Bash 以及this question 接受的答案。

Bash 4.4

在 Bash 4.4 中引入了变量 $PS0。这是man page的引述:

这个参数的值被扩展(见下面的提示) 并在读取命令后由交互式 shell 显示 在命令执行之前。

因此,使用 bash 4.4,您可以执行以下操作:

PS0="\[$(tput sgr0)\]"

\[\] 用于包围不可打印的字符(这里是终端控制序列来重置文本属性)。我不确定PS0 是否真的需要这样做,但它不会受到伤害。无论哪种方式,shell 输出都没有视觉差异。

【讨论】:

  • \[\] 用于确保 shell 从它们之间产生的实际字符序列中计算出正确的长度。
  • @DavidC.Rankin 我知道,更新了最后一句话以使其(希望)更清晰。
【解决方案2】:

要扩展 Ralf's answer 以使命令 bold 在 bash 4.4+ 中需要设置 PS1PS0,如下所示:

PS1="\[\e[32m\]\u@\h \t \W \\$\[\e[0;30;1m\] "
PS0="\[$(tput sgr0)\]"

显然你可能不喜欢我无聊的提示,但它为你提供了一个粗体命令的起点。 \[\e[0;30;1m\] 将命令设置为以黑色文本和粗体显示。其他color choices 可能更适合你。

我在使用asciinema 捕获文档示例时发现这很方便。它让我想起了O'Reilly style 包含 UNIX 控制台示例,命令以粗体显示。

【讨论】:

    猜你喜欢
    • 2017-11-28
    • 2018-01-24
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2014-04-16
    相关资源
    最近更新 更多