我有命令产生属于不同命令的输出。
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)