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

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

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

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

尝试以下操作:

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

Chepners的回答给了我更好的启发:

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

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

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

你好,我只是找出答案。

Vlad在评论中的链接给了我方向。

我可以使用子壳体。

我的命令可以被指定

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

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

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

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