Bash:如何突出显示已执行的命令?



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

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

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

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

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

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

Upd2.:使用expect- 带有交互式程序的程序对话似乎是一个好主意。

编辑:

您所要求的是不可能的:

  1. 如果不修补bash,就不可能将 bash 的-v输出与程序的 stderr 分离
  2. 即使可以,拆分输出也无法轻松重新同步,因此您无法使每行都着色,然后直接跟随其输出。

您轻松获得所需内容的唯一方法是

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

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

源语言:

由于目前没有办法告诉 bash 使用另一个描述符来输出-v,所以你不能把它和脚本的 stderr 分开。

如果你想实现的是只突出显示-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>&3n{'; cat script; echo $'n} 2>&4') 3> >(sed $'s,.*,e[38;5;123m&e[m,' >&2) 4>&2
  • (请注意,第二个printf中的''部分是处理没有尾随换行符的脚本(
  • 请务必使用除3以外的其他 FD,4脚本需要使用它们

相关内容

  • 没有找到相关文章

最新更新