我正在尝试使用以下方法计时:
/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
选择将输出写入time
stderr 之外的其他位置。您可以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