Bash: 如何高亮执行的命令?

Bash: how to highlight executed commands?

Bash 提供选项 -v --verbose 将命令写入标准错误。
需要突出显示此输出。 当前解决方案

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

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

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

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

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

Upd2.: 使用 expect 看起来是个好主意 - 带有交互式程序的编程对话..

编辑:

你问的是不可能的:

  1. 如果不打补丁 bash,就不可能从程序的 stderr
  2. 中分离出 bash 的 -v 输出
  3. 即使这是可能的,拆分输出也无法轻易重新同步,因此您无法将每一行都着色后直接跟在其输出上。

您可以轻松获得想要的东西的唯一方法是

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

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

原版:

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

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

  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 中的 '' 部分用于处理没有尾随换行符的脚本)
  • 请务必使用 3 以外的其他 FD,并且 4 是您的脚本需要使用它们