Bash: 如何高亮执行的命令?
Bash: how to highlight executed commands?
Bash 提供选项 -v
--verbose
将命令写入标准错误。
需要突出显示此输出。
当前解决方案
bash -v script 2> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2)
突出显示 stderr 中的所有内容。
所以问题是要将 -v
输出与其他 stderr 分开。
加法。
bash 有 BASH_XTRACEFD
可用于突出显示 -x
(xtrace) 输出。
更新:这种重定向也违反了 command/response 的顺序 - 响应可以出现在命令之前。
所以目前的解决方案是什么都不突出。
Upd2.: 使用 expect
看起来是个好主意 - 带有交互式程序的编程对话..
编辑:
你问的是不可能的:
- 如果不打补丁
bash
,就不可能从程序的 stderr 中分离出 bash 的 -v
输出
- 即使这是可能的,拆分输出也无法轻易重新同步,因此您无法将每一行都着色后直接跟在其输出上。
您可以轻松获得想要的东西的唯一方法是
- 调整您的脚本,使每一行都可以单独获取(是有效的 bash 命令行)
- 创建一个包装器脚本,逐行读取您的脚本,并在彩色打印后对其进行评估。
我的原始答案(保留在下面)使用了一种解决方法,它可以满足您的需求,但需要注意的是将所有彩色输出分组在一个块中(并且您希望每一行在执行时都被着色)。
原版:
由于目前无法告诉 bash 为 -v
的输出使用另一个描述符,因此您无法将它与脚本的标准错误分开。
如果您想要实现的只是突出显示 -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
是您的脚本需要使用它们
Bash 提供选项 -v
--verbose
将命令写入标准错误。
需要突出显示此输出。
当前解决方案
bash -v script 2> >(sed $'s,.*,\e[38;5;123m&\e[m,' >&2)
突出显示 stderr 中的所有内容。
所以问题是要将 -v
输出与其他 stderr 分开。
加法。
bash 有 BASH_XTRACEFD
可用于突出显示 -x
(xtrace) 输出。
更新:这种重定向也违反了 command/response 的顺序 - 响应可以出现在命令之前。
所以目前的解决方案是什么都不突出。
Upd2.: 使用 expect
看起来是个好主意 - 带有交互式程序的编程对话..
编辑:
你问的是不可能的:
- 如果不打补丁
bash
,就不可能从程序的 stderr 中分离出 bash 的 - 即使这是可能的,拆分输出也无法轻易重新同步,因此您无法将每一行都着色后直接跟在其输出上。
-v
输出
您可以轻松获得想要的东西的唯一方法是
- 调整您的脚本,使每一行都可以单独获取(是有效的 bash 命令行)
- 创建一个包装器脚本,逐行读取您的脚本,并在彩色打印后对其进行评估。
我的原始答案(保留在下面)使用了一种解决方法,它可以满足您的需求,但需要注意的是将所有彩色输出分组在一个块中(并且您希望每一行在执行时都被着色)。
原版:
由于目前无法告诉 bash 为 -v
的输出使用另一个描述符,因此您无法将它与脚本的标准错误分开。
如果您想要实现的只是突出显示 -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
是您的脚本需要使用它们