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
- 带有交互式程序的程序对话似乎是一个好主意。
编辑:
您所要求的是不可能的:
- 如果不修补
bash
,就不可能将 bash 的-v
输出与程序的 stderr 分离 - 即使可以,拆分输出也无法轻松重新同步,因此您无法使每行都着色,然后直接跟随其输出。
您轻松获得所需内容的唯一方法是
- 调整您的脚本,以便每一行都可以单独获取(是有效的 bash 命令行( 创建一个包装脚本,该
- 脚本逐行读取脚本,并在打印着色后对其进行评估。
我的原始答案(保留在下面(使用了一种解决方法,该解决方法可以执行您想要的操作,但需要注意将所有彩色输出分组到一个块中(并且您希望在执行时对每一行进行着色(。
源语言:
由于目前没有办法告诉 bash 使用另一个描述符来输出-v
,所以你不能把它和脚本的 stderr 分开。
如果你想实现的是只突出显示-v
的输出(而不是stderr(,那么可以实现的唯一方法是调整脚本以手动分离流:
- 添加
exec 2>&3
作为脚本中的第一个指令, - 将代码的其余部分包装在
{ ... ; } 2>&4
块中 - 呼叫
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
脚本需要使用它们