Bash time 关键字结果仅与第二个管道命令一起使用,解释原因

Bash time 关键字结果仅与第二个管道命令一起使用,解释原因

我有一个 bash time 关键字命令,我无法完全解释,但它对我有用。

我的目标:

  1. 查找某个 python 脚本的执行时间,该脚本从 bash 脚本中获取变量 btw,并捕获该值。

  2. 还可以在同一变量中捕获 python 脚本的输出,以进行成功或失败分析。

在阅读了周围之后,我最终得到了这个命令,但我无法完全解释它。

ttime=$( (TIMEFORMAT="%U^"; time  /../myscript.py ${__myvar} 2>&1 )|& tr -d f)

您能解释一下为什么我需要管道中的第二个命令tr -d f,以便将时间值附加到命令的输出中,

“tr -d f”的选择完全是任意的,不会影响我的脚本的输出、std 或 err,但如果没有它,或者以某种较小的方式作用于脚本文本输出的另一个命令,我会看到 python 的返回没有附加时间,为什么?

编辑:

真正的问题应该是为什么|& tr -d f。需要,正如 Stephanie 所说,|& 允许将 time 关键字中的 sterr 中找到的计时传递到管道输出中

解决方案现在看起来像:

ttime=$(TIMEFORMAT="%U^"; { time /../myscript.py ${__myvar} ; } 2>&1 )

字段描述符教程:

http://wiki.bash-hackers.org/howto/redirection_tutorial

答案1

在 中bash,就像在 中一样kshtime是一个关键词(非内置)用于计时管道(不仅可以简单命令,还可以计时复合命令)。

在 中time cmd 2> something,我们计时cmd 2> something并将输出打印到 stderr,但打印到原始 stderr。

您需要重定向 stderrtime构造被调用。您可以使用|&重定向子 shell 的 stdout 和 stderrtime来执行此操作,但更简单的方法是:

time=$(TIMEFORMAT="%U^"; { time cmd; } 2>&1)

这不涉及子shell(这里我们使用指挥组相反)也不是额外的命令。

请注意bash

time=$(time (cmd) 2>&1)

偶然发生工作。我不会依赖它,因为它可能在未来的版本中发生变化,并且在其他具有关键字的 shell 中不起作用time

如果您只需要计时输出$time(而不是命令的 stdout 或 stderr),您可以这样做:

{ time=$(TIMEFORMAT="%U^"; { time cmd 2>&3 3>&-; } 2>&1); } 3>&1

相关内容