我知道进程运行时会附加 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
操作方式相同)。标准误差仍然重定向到之前的位置(可能是当前终端)。