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
-与交互式程序进行编程对话似乎是个好主意。
答案 0 :(得分:1)
编辑:
您要的是不可能的:
bash
,则无法从程序的stderr中分离bash的-v
输出唯一可以轻松获得所需内容的方法就是
我的原始答案(保留在下面)使用一种变通方法,该方法可以实现您想要的,但需要注意的是将所有彩色输出分组在一个块中(并且您希望每行执行时都进行彩色处理)。
原始:
由于当前无法告诉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>&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