重定向 - 为什么它不能这样工作

重定向 - 为什么它不能这样工作

我知道进程运行时会附加 3 个流,即输入流、输出流和错误流。

并且重定向执行工作从左到右。

我打算执行一个命令,将其输出流重定向到一个文件并将其错误流也重定向到同一个文件。

-- nofile 不存在,text1 文件存在

head nofile text1 1> output.txt 2> output.txt  -- I know this won't work.

head nofile text1 1> output.txt 2>&1 -- while this will work, passing the error stream to the output ste

q1)为什么?

如果这是“应该这样写”的问题,那么为什么下面的方法不能正常工作

head nofile text1 2>&1 1> output.txt
head nofile text1 2>&1> output.txt

上面我将错误流重定向到输出流,将输出流重定向到文件。其逻辑与上面的相同。

答案1

答案#1:种族冲突

  • head nofile text1 1> output.txt 2> output.txt #——我知道这行不通。`

这实际上是有效的,即使不像你预期的那样,也不符合你的目的。
你有 2 个文件描述符,它们将被独立重定向到同一个输出文件> output.txt
一个文件描述符将运行得更快:它将创建 output.txt 文件并开始在其中写入。
当第二个文件描述符开始运行时,它将重新创建同一个文件 ( > output.txt),删除其中的内容。
你将丢失第一个文件描述符写入的第一部分(如果有)。
输出可能会出现乱码,尤其是长输出。参见此也回答
请考虑该行为并非总是可重现的。今天,在我的系统上,文件创建时将错误作为第一行,后面是文本。

  • head nofile text1 1> output.txt 2>&1 # ok,成功了

这是可行的,因为首先你将标准输出的重定向更改为文件output.txt。然后你要求将标准错误重定向到相同的目的地标准输出,即文件output.txt

答案#2:顺序很重要
答案:狂欢重定向不可交换代表着订单很重要

head nofile text1 2>&1 1> 输出.txt
head nofile text1 2>&1> 输出.txt

在您要求重定向之前标准误差标准输出目的地(可能是当前终端)然后你要求更改仅标准输出到输出文件output.txt。(命令1>output.txt>output.txt操作方式相同)。标准误差仍然重定向到之前的位置(可能是当前终端)。

相关内容