为什么附加到日志文件的是 2>&1 而不是 2>>&1

为什么附加到日志文件的是 2>&1 而不是 2>>&1

我将 STDOUT 和 STDERR 重定向到单个文件,并且文件一直在增长,因此我总是使用“附加”重定向;这是>>

我的命令是command >> logfile 2>&1

并且它有效。

但是 STDERR 重定向只有一个>,我用它来“创建”文件,删除前一个文件,如下所示command > outlog 2> errlog

为什么在这种情况下它不会删除日志文件?

答案1

当你将某个文件重定向到 时,你根本不会打开一个新文件;你&number重用已打开的文件以及它以何种模式打开。

>&这些数字指的是“打开文件”句柄(文件描述符)。因此,和>>&(以及)的工作方式在技术上没有区别<&——它们都只是表示“使用 dup() 克隆现有文件描述符”。

也就是说,2>&1表示文件描述符 #1(您之前打开的用于附加使用>>logfile) 克隆到数字 #2 中。是的,2<&1工作原理完全相同。

技术说明:附加或截断不是 shell 的明确操作;它实际上是 shell 指定的一种模式打开时文件,其余部分由操作系统本身执行。例如,当你使用>shell时手动删除旧内容,它只是在调用 open() 时添加 O_TRUNC。因此,当 open() 未被调用时根本,之前的模式保持不变。

答案2

该序列command >> logfile 2>&1有两个重定向阶段:

  • command >> logfile将附加到日志文件
  • 2>&1将重定向 stderr 到 stdout(它本身附加到日志文件)

因此command >> logfile 2>&1不会截断日志文件,而command >>logfile 2>logfile会。

相关内容