我将 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
会。