如何捕获几个命令的输出?

时间:2013-11-18 15:21:09

标签: linux bash shell time

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

s=$(time dd if=<source> of=/dev/null bs=<number> count=<number> 2>&1)

$s将仅包含来自dd命令的输出。我怎样才能有另一个包含time输出的变量?

3 个答案:

答案 0 :(得分:3)

尝试以下方法:

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

Chepners的答案给了我更好的灵感:

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

$()已经是子shell,因此无需创建额外的子shell。在命令之前放置exec 2>&1;会重定向整个子shell的stdout,将它放在命令之后会使它成为time命令的一部分,因此仅应用于传递给time的命令。省略exec和分号将尝试执行内置的系统time二进制intead,如果不存在则输出错误。省略exec但保留分号将不起作用,因为这只会导致重新定向新的分叉进程,并且内置时间不会是新进程。

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

答案 1 :(得分:1)

你好,我找到了答案。

弗拉德在评论中的链接给了我指示。

我可以使用子壳。

可以指定我的命令

s=$((time dd if=<source> of=/dev/null bs=<number> count=<number> 2>&1 | tail -n1) 2>&1)

然后我可以让$ s变量包含所有数据,我可以拥有数组并获取值。

答案 2 :(得分:1)

bash内置time是一个特殊的内置函数,可以写入当前shell的标准错误,因此您不能简单地重定向其输出。相反,您需要在其标准错误已被重定向的子shell中运行它。这导致的“实际”命令在子shell中运行,因此您不能简单地将其输出分配给变量,因为该变量将随子shell消失。试试这个:

s=$( exec 2>time.txt; time echo foo )
t=$(< time.txt)