我知道 0 、 1、 2 是 STDIN 、 STDOUT 和 STDERR 文件描述符。我试图理解重定向。'>' 表示转储到文件 '>>' 表示追加
但是 '>&' 有什么作用呢?以下命令的分步过程是什么?
command > file 2>&1
command > file 2<&1
我知道 0 、 1、 2 是 STDIN 、 STDOUT 和 STDERR 文件描述符。我试图理解重定向。'>' 表示转储到文件 '>>' 表示追加
但是 '>&' 有什么作用呢?以下命令的分步过程是什么?
command > file 2>&1
command > file 2<&1
让我们一步一步分析:
>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 都可以写入。
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
表示重定向STDERR
到将要到达的同一个地方STDOUT
。它有用的一个例子是grep
,它通常适用于STDOUT
this 使其适用于STDOUT
and STDERR
:
app 2>&1 | grep hello