我有命令产生的输出属于不同的命令。

s=$(time dd if=<source> of=/dev/null bs=<number> count=<number> 2>&1)
$s将仅包含dd命令的输出。我如何拥有另一个包含time输出的变量?

最佳答案

请尝试以下操作:

s=$({ time dd ... > /dev/null;} 2>&1)

骗子的回答给了我可以说是更好的灵感:
s=$(exec 2>&1; time dd ... > /dev/null)
$()已经是一个子shell,因此无需创建额外的子shell。将exec 2>&1;放在命令之前会重定向整个子shell的stdout,将其放在命令后会使它成为time的一部分,因此仅应用于传递给time的命令。省略exec和分号将尝试执行内置的系统time二进制intead,如果不存在,则会出错。仅省略exec但保留分号将不起作用,因为那样将仅导致新 fork 的进程被重定向,并且内置的时间将不是新的进程。

哦,顺便说一句,> /dev/null不会将time本身的输出转储到/dev/null,因为它也是time执行的命令的一部分,并且不应用于时间本身。

07-28 03:04
查看更多