为什么不同重定向方式的命令执行时长会有差异?

vaj*_*elu 3 io-redirection tty time

我正在find以普通用户身份运行定时命令。

我所知道的是重定向是为了防止终端上的 stdout/stderr 消息。如果是这样,为什么不同的重定向方法需要不同的时间?它是否与 tty 上的写入速度有关,或者背后是否有其他原因?有人能指出我正确的方向来理解这一点吗?

$ id
uid=1000(user1) gid=1000(user1) groups=1000(user1),1001(user2)

$time find /
<truncated output>
real    0m13.902s
user    0m0.197s
sys 0m0.448s

$ time find /  >/dev/null  
<truncated output>
real    0m0.298s
user    0m0.068s
sys 0m0.206s

$time find /  2> /dev/null 
<truncated output>
real    0m13.279s
user    0m0.181s
sys 0m0.405s

$ time find /  > /dev/null 2>&1
real    0m0.306s
user    0m0.109s
sys 0m0.174s
Run Code Online (Sandbox Code Playgroud)

use*_*516 5

当您的进程 ( find) 需要实际写出输出时,这显然比您告诉它丢弃所述输出需要更长的时间。

  • 当您使用时find /,stdout 和 stderr 都会发送到您的终端,并且必须将它们都写出(即,实际结果和所有权限错误等等)

  • 当您使用时,time find / >/dev/null您将删除命令的标准输出,但仍会打印出所有错误(如果有)。从你的结果来看,你有很多合法的结果和很少的错误。

  • 当您使用 时time find / 2> /dev/null,命令的标准输出仍在发送到您的终端,但现在您只是删除了标准错误。如果您通过文件系统查找您没有读取权限的文件,这实际上会非常快。

  • 当您使用 时time find / > /dev/null 2>&1,您将删除标准输出,然后将标准错误发送到发送标准输出的位置,...即,您同时删除了两者。这不会输出任何内容,因此将是所有命令中最快的。

  • `find` 本身在所有情况下所做的工作量完全相同。减慢一切的额外工作由您的终端模拟器完成,它必须扫描每个字符以进行 VT100 转义,然后将文本渲染到像素缓冲区中,而 X 服务器则负责在屏幕上绘制像素缓冲区。`find` 在挂钟方面确实需要更长的时间,但这只是因为它不断填满 tty 输出队列并被阻塞。 (3认同)
  • TL;DR:是的,将文本写入 tty 需要时间。 (2认同)