重定向“时间命令”中命令的输出


11

我正在尝试使用以下方法计时:

/usr/bin/time myCommand

但是,由于/usr/bin/time写入stderr,所以如果myCommand也写入stderr,则在流上我将获得的不仅仅是时间的输出。我想做的是,将myCommand的所有输出重定向到/dev/null,但仍将time的输出写入stderr。通过使用示例myCommand写入stderr 的示例ls /nofile,我们看到(显然)在以下情况下根本没有输出:

$ /usr/bin/time ls /nofile 2> /dev/null
$

在没有任何重定向的情况下,我们既看到ls(到stderr)的输出,也看到时间到(stderr的)输出:

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

我想要的只是产生的东西:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

有任何想法吗?


我在脚本文件中使用时间命令。我想要在stdout中而不是stderr中输出时间。我怎么能得到这个?

Answers:


20

在ksh,bash和zsh中,time是关键字,而不是内置关键字。同一行上的重定向仅适用于定时命令,不适用于其time自身的输出。

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

time在这些shell中重定向自身的输出,您需要使用附加级别的分组。

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

如果使用独立time实用程序的GNU版本,则可以-o选择将time标准输出以外的其他输出写入。您可以time写入终端:

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

如果要避免输出出现time标准错误,则需要额外级别的文件描述符改组。

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

使用任何time实用程序,您都可以调用中间外壳来执行所需的重定向。调用中间shell来执行诸如cd,重定向之类的额外操作是很常见的-这是shell设计要做的小事情。

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

以下是一些后续行动:1)您上一条建议中的“执行人员”有什么作用?似乎没有它也可以工作:/ usr / bin / time sh -c'exec ls / nofile&> ./ output.dat'2)是一个“中间外壳”,与“子外壳”相同(您会得到我想使用括号吗?)。我一直在尝试像/ usr / bin / time(ls / nofile&> ./ output.dat)之类的方法,但无济于事。3)什么是/ dev / tty?我知道tty0是stdin,tty1 = stdout,tty2 = stderr,但是“ tty”呢?
David Doria 2014年

4)使用/ dev / fd3选项,似乎是在说将-o输出写入3,然后将3重定向到2,将1重定向到null,然后将2重定向到null。由于重定向从左到右发生,那也不应该发送3到null吗?
David Doria 2014年

1
@DavidDoria exec用指定程序替换外壳程序,而不是将该程序作为子进程运行。当命令是脚本中的最后一个命令时,某些外壳程序会自动执行此优化。“中间外壳”仅表示:位于time和之间的外壳mycommand;它与子外壳无关。/dev/tty是命令在其上运行的终端(与/dev/ttyNUM物理控制台无关);您对文件描述符感到困惑:stdin是/dev/fd/0,等等。
吉尔斯(Gilles)'所以

@DavidDoria 更改文件描述符的连接顺序从左到右,这具有相反的效果。参见unix.stackexchange.com/questions/23964/…unix.stackexchange.com/questions/37660/order-of-redirections
别再邪恶了'

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s

那不是相同的“时间”(我相信这是bash的别名)。请注意,它没有遵循任何明智的重定向规则?$ time&> / dev / null real 0m0.000s用户0m0.000s sys 0m0.000s
David Doria

1
怎么样:/ usr / bin / time -o time / usr / bin / find / etc / pki / CA / private /&> / dev / null; 猫的时间
Artur Szymczak 2014年

是的,我已经看到了,但是我更好奇如何不使用-o这样的内部机制来做到这一点。
David Doria 2014年

@DavidDoria是什么给您的印象time是bash别名? 在CentOS 5.7中which time显示/usr/bin/time
蒂莫西·马丁

type time将向您显示:time is a shell keyword
Artur Szymczak 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.