代码之家  ›  专栏  ›  技术社区  ›  kyb thursdaysDove

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

  •  0
  • kyb thursdaysDove  · 技术社区  · 6 年前

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

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

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

    所以问题是分开 -五 从其他服务器输出。

    添加。 巴什有 BASH_XTRACEFD 可以用来突出显示 -x (xtrace)输出。

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

    Upd2.:使用 expect -与互动程序的编程对话。。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Camusensei    6 年前

    编辑:

    你的要求是不可能的:

    1. 没有修补 bash ,无法分离bash的 -v 程序stderr的输出
    2. 即使这是可能的,分割输出也不能很容易地重新同步,因此您不能让每一行的颜色都直接跟在它的输出后面。

    你能轻易得到你想要的东西的唯一方法就是

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

    我最初的答案(保留在下面)使用了一种解决方法,它可以实现您想要的功能,但需要注意的是将所有着色输出分组到一个块中(并且您希望在执行时对每一行进行着色)。

    原件:

    因为目前没有办法告诉bash使用另一个描述符 -五 的输出,因此无法将其与脚本的stderr分离。

    如果你只想突出显示 -五 的输出(而不是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 是处理没有尾随换行符的脚本)
    • 请务必使用其他FD 3 4 你的脚本需要使用它们吗