我有一个 bash time 关键字命令,我无法完全解释,但它对我有用。
我的目标:
查找某个 python 脚本的执行时间,该脚本从 bash 脚本中获取变量 btw,并捕获该值。
还可以在同一变量中捕获 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 )
字段描述符教程:
答案1
在 中bash
,就像在 中一样ksh
,time
是一个关键词(非内置)用于计时管道(不仅可以简单命令,还可以计时复合命令)。
在 中time cmd 2> something
,我们计时cmd 2> something
并将输出打印到 stderr,但打印到原始 stderr。
您需要重定向 stderr前该time
构造被调用。您可以使用|&
重定向子 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