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

时间:2018-10-07 08:47:25

标签: bash highlight verbose

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-与交互式程序进行编程对话似乎是个好主意。

1 个答案:

答案 0 :(得分:1)

编辑:

您要的是不可能的:

  1. 如果不修补bash,则无法从程序的stderr中分离bash的-v输出
  2. 即使有可能,拆分的输出也无法轻松地重新同步,因此您将无法使每行都带有颜色,然后再直接为其输出着色。

唯一可以轻松获得所需内容的方法就是

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

我的原始答案(保留在下面)使用一种变通方法,该方法可以实现您想要的,但需要注意的是将所有彩色输出分组在一个块中(并且您希望每行执行时都进行彩色处理)。

原始:

由于当前无法告诉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>&3\n{'; cat script; echo $'\n} 2>&4') 3> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2) 4>&2
  • (请注意第二个''中的printf部分将处理没有尾随换行符的脚本)
  • 请确保使用3以外的其他FD,并且4是您的脚本需要使用的FD