重定向“time command”中命令的输出

重定向“time command”中命令的输出

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

/usr/bin/time myCommand

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

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

在没有任何重定向的情况下,我们可以看到来自(到 stderr)的输出ls和来自 time(也到 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

有任何想法吗?

答案1

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

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

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

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

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

如果您使用独立的 GNU 版本time实用程序,它可以-o选择将输出写入timestderr 之外的其他位置。您可以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 来执行所需的重定向。调用中间 shell 来执行额外的操作(例如cd,重定向等)非常常见 - 这是 shell 设计用来执行的小事情。

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

答案2

[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

相关内容