我知道0,1,2是STDIN,STDOUT和STDERR文件描述符。 我想了解重定向。 '>'表示转储到文件 '>>'意思是追加
但'>&'是什么做什么? 以下命令的分步过程是什么?
command > file 2>&1
command > file 2<&1
答案 0 :(得分:6)
让我们一步一步地分析它:
>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都是可以写的。
答案 1 :(得分: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
将stderr从stdout重定向到read
。因为没有人从stderr读取,所以第二次重定向通常没有效果。
但是,bash将此特殊情况视为与2>&1
相同,因此执行dup2 (1, 2)
。
答案 2 :(得分:1)
2>&1
表示将STDERR
重定向到STDOUT
要去的同一个地方。一个有用的示例grep
通常适用于STDOUT
,这使得它可以在STDOUT
和STDERR
上运行:
app 2>&1 | grep hello