【问题标题】:Bash. Using ccze without altering data for parsing重击。使用 ccze 而不更改数据进行解析
【发布时间】:2017-06-03 23:47:50
【问题描述】:

我的 bash 脚本上有一个复杂的命令,它会在标准输出上打印很多信息。此命令很复杂,需要一些时间才能完成,但可以正常工作。同时,我正在使用带有 tee 的管道将其写入文件以进行后解析任务。

cmd="myComplexCommand | tee /dev/fd/5"
exec 5>&1
stored_output=$(eval "${cmd}")

直到这里一切正常。

现在,我正在尝试实现 ccze 来为屏幕输出着色。通常在任何命令上使用它都很简单:

anyCommand | ccze -A

一切都以美丽的彩色方式印刷。问题是,如果我尝试将其应用于我的特定情况,在使用管道对 myComplexCommand 进行 ccze 之后,屏幕上的输出是彩色的(很好!)但它会改变存储在我想在我的帖子上解析的文件中的输出-parse 任务,它不起作用。

是否有一种 Bash 方法可以在屏幕上以一种美观的方式使用 ccze 打印命令,同时将其存储在文件中(无需 ccze 修改)以供以后解析?

【问题讨论】:

  • 顺便说一句,在这里使用eval 是一种严重的代码异味。更好的做法是使用函数存储代码:cmd() { myComplexCommand | tee /dev/fd/5; },然后调用cmd

标签: bash parsing stdout tee colorize


【解决方案1】:

tee 在管道中的某个点归档着色发生之前:

myComplexCommand | tee filename | ccze -A

顺便提一下,在 bash 4.1 或更高版本中,如果您想将 很多 数据同时发送到文件并以彩色形式发送到 TTY,您可以将这两个操作放在一个进程替换中:

exec {stdout_backup}>&1
exec {store_and_colorize}> >(tee filename | ccze -A | tee /dev/fd/"$stdout_backup")

然后根据需要多次重复使用该进程替换:

result=$(something >&$store_and_colorize)
another_result=$(something_else >&$store_and_colorize)

这样你就得到了一份ccze 的副本,可以在多次使用中持续存在。

【讨论】:

  • 您有关于该 proc 子用法的任何文档吗?以前没见过。
  • 哪些细节不熟悉? exec {name}> ... 是 bash 4.1 的自动 FD 分配,不特定于进程替换。
  • 是的,我不知道它具体是什么。 Nvm automatic FD allocation 已经足够找到了,干杯。
猜你喜欢
  • 2012-08-21
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2015-10-12
  • 1970-01-01
相关资源
最近更新 更多