【问题标题】:Bash: how to highlight executed commands?Bash:如何突出显示已执行的命令?
【发布时间】:2019-03-12 05:11:51
【问题描述】:

Bash 提供了选项 -v --verbose,它在读取到 stderr 时将命令写入。
需要突出显示此输出。 目前的解决方案

bash -v script 2> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2)

突出显示 stderr 中的所有内容。

所以问题是将-v 输出与其他stderr 分开。

加法。 bash 有BASH_XTRACEFD,可用于突出显示-x(xtrace) 输出。

更新:这种重定向也违反了命令/响应的顺序 - 响应可以出现在命令之前。
所以目前的解决方案是不突出任何内容。

Upd2.:使用expect 似乎是个好主意 - 与交互式程序进行编程对话..

【问题讨论】:

  • 有趣的概念!为了提高可读性(或不提高可读性),我使用了“/bin/bash -v 2> >( grep --color .)”。
  • 这将突出显示传递给 stderr 的任何内容。就像我目前的简单丑陋解决方案:(

标签: bash highlight verbose


【解决方案1】:

编辑:

你所要求的是不可能的:

  1. 如果不修补 bash,就无法将 bash 的 -v 输出与程序的 stderr 分离
  2. 即使可以做到这一点,拆分输出也无法轻松重新同步,因此您无法将每条线直接着色,然后直接输出。

您可以轻松获得所需的唯一方法是

  1. 调整您的脚本,以便每一行都可以单独获取(是有效的 bash 命令行)
  2. 创建一个包装脚本,它逐行读取您的脚本,并在将其着色后对其进行评估。

我的原始答案(保留在下面)使用了一种解决方法,可以满足您的要求,但需要注意的是,将所有彩色输出分组到一个块中(并且您希望每行在执行时都被着色)。

原文:

由于目前无法告诉 bash 为 -v 的输出使用另一个描述符,因此您无法将其与脚本的 stderr 分开。

如果您想要实现的只是突出显示 -v 的输出(而不是标准错误),那么实现该目标的唯一方法是调整脚本以手动分离流:

  1. exec 2>&3 添加为脚本中的第一条指令,
  2. 将其余代码封装在 { ... ; } 2>&4 块中
  3. 致电bash -v newscript 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2

如果你想要一个包装器自动完成所有这些,你可以使用这个:

bash -v <(printf %s\\n 'exec 2>&3' '{'; cat script; printf %s\\n '' '} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2

或者如果你是echo 的粉丝:

bash -v <(echo $'exec 2>&3\n{'; cat script; echo $'\n} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
  • (请注意,第二个printf 中的'' 部分用于处理没有尾随换行符的脚本)
  • 请务必使用除34 之外的其他FD,您的脚本是否需要使用它们

【讨论】:

  • 感谢您的回复。 Bash 将括号中的内容作为一个命令读取。所以我在一个块中突出显示了{ script contents },然后才输出。
  • 这没有帮助。效果和cat script &gt; &gt;(colorify)一样,其中colorify是sed ...周围的一个函数
  • 你是对的。我担心您的问题除了等待或修补 bash 以选择将 -v 的输出写入哪个 FD 之外没有解决方案。
猜你喜欢
  • 1970-01-01
  • 2020-03-27
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2020-03-24
  • 2018-01-24
  • 2018-12-02
  • 2013-10-18
相关资源
最近更新 更多