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


1

我知道运行时有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

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


2
我把它读2>&1作“将文件描述符2重定向到fd 1当前指向的东西 ” - 这使得更容易理解为什么2>&1 1>filestderr没有被重定向到文件
glenn jackman 2015年

1
Illustrated Redirection Tutorial中有一个很好的插图教程,这使得这个更容易理解。
DavidPostill

Answers:


0

答案#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:订单问题答案
核心bash重定向不是可交换的,这意味着订单很重要

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

在此之前,您要求将标准错误重定向到标准输出目标(可能是当前的tty)。然后,您要求仅将标准输出更改为输出文件output.txt。(命令1>output.txt>output.txt行为都是一样的)。该标准错误仍然重定向其原来的位置(可能是当前的tty)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.