1

我知道 0 、 1、 2 是 STDIN 、 STDOUT 和 STDERR 文件描述符。我试图理解重定向。'>' 表示转储到文件 '>>' 表示追加

但是 '>&' 有什么作用呢?以下命令的分步过程是什么?

command > file 2>&1       
command > file 2<&1       
4

3 回答 3

5

让我们一步一步分析:

  • >place意味着重新打开标准输出,以便它开始写入place,这是一个将打开以供写入的文件名。这是典型的重定向。

  • N>place对任意文件描述符n执行相同的操作。例如,2>place将标准错误(文件描述符 2)重定向到place. 1>place是一样的>place

  • 如果place使用特殊语法编写&N,它将被视为现有文件描述符编号而不是文件名。因此,>&2两者1>&2都意味着重新打开标准输出以写入标准错误,2>&1反之亦然。

输入也一样,除了place和打开描述符以供读取,符号左侧的文件描述符<默认为 0,代表标准输入。2<&1表示“重新打开文件描述符 2 进行读取,以便将来从中读取实际上是从文件描述符 1 读取”。这在普通程序中是没有意义的,因为文件描述符 1 和 2 都可以写入。

于 2012-11-19T07:39:01.727 回答
4

NUMBER1>&NUMBER2表示将文件描述符 NUMBER2 分配给文件描述符 NUMBER1。

这意味着,执行dup2 (NUMBER2, NUMBER1).

command > file 2>&1

Bash 处理命令行,它首先找到重定向>file,它改变要写入的stdout file,然后继续处理并找到2>&1,并将stderr 写入stdout(file此时是)。

command > file 2<&1       

这是相同的,但2<&1将标准错误重定向到read标准输出。因为没有人从 stderr 读取,所以第二次重定向通常没有效果。

但是,bash 对待这种特殊情况的处理方式与 for 相同2>&1,因此执行dup2 (1, 2).

“2<&1”重定向在 Bourne shell 中有什么作用?

于 2012-11-19T07:26:26.740 回答
1

2>&1表示重定向STDERR到将要到达的同一个地方STDOUT。它有用的一个例子是grep,它通常适用于STDOUTthis 使其适用于STDOUTand STDERR

app 2>&1 | grep hello
于 2012-11-19T07:26:59.850 回答