简单来说“>&”是什么?

简单来说“>&”是什么?

有什么$ command 1>&2作用?据我了解,这会运行commandSTDOUT重定向到STDERR.但我不确定具体是如何>&运作的。

我把它看作$ command 1>&2$ command 2>&1

我认为 和1分别是和2的文件描述符,但我什至不确定这意味着什么。STDOUTSTDERR

我在 SO 和其他资源上发现了>&某种重定向“东西(运算符??)”,我不确定它到底是如何工作的。它是二元运算符吗?甚至是运营商吗?

有人可以解释一下吗新手术语这是做什么的。

答案1

在该语法中,您是正确的,即1STDOUT 和2STDERR。它的作用是“把东西 A 发送到东西 B 所在的地方”。因此,2>&1也可以写为2 > &1,获取 STDERR,并将其发送到 STDOUT。这不一定是原始的 STDOUT。它>&并不是真正的一个单元,只是经常以这种方式写在一起。这>是“重定向”运算符。

有趣的是订购......例如:

$ command 2>&1 > file.out

不同于

$ command > file.out 2>&1

第一个将 STDERR 发送到 STDOUT,然后将 STDOUT 发送到“file.out”,因此您可以在同一位置获得 STDERR 和 STDOUT。第二个将 STDOUT 发送到“file.out”,然后将 STDERR 发送到 STDOUT,因此您最终会在终端窗口中看到 STDERR,而不是在文件中。

答案2

&是您为 shell 打开的文件描述符指定的前缀,而不是未打开文件的路径(这是默认值)。STDOUT几乎总是文件描述符1并且STDERR几乎总是2.

对于尖括号,您的 shell 通常足够聪明,知道它前面的任何数字都将是文件描述符。如果您省略其中之一,通常会假设您正在谈论STDOUTfor>STDINfor <

所以把它放在一起:

# command > /tmp/myFile
# command 1> /tmp/myFile

两者都直接command指向STDOUT名为的平面文件/tmp/myFile

# command >&2
# command 1>&2

两者都直接command指向STDOUT文件描述符2(STDERR)处已打开的文件。

# command 2>&1

将通常写入的任何内容重定向STDERR到文件描述符编号1( STDOUT)。

这些对于您从 shell 本身执行的任何类型的文件 I/O 都是通用的。只是所讨论的特定文件描述符本身通常具有特殊含义。

如果您希望可以重定向STDERR到一个文件,您也可以告诉它将文件描述符分配2给指定文件:

# command 2> /tmp/newFile 

例如:

[root@edc4 ~]# ./causeError 2>/tmp/containError
[root@edc4 ~]# cat /tmp/containError
Error Message
[root@edc4 ~]#

Bash 指南更详细地介绍了如何使用bash.您可以在文件描述符下打开文件,而不是通常的三个(012),但这通常是为更复杂的脚本保留的,人们通常只处理通常的三个。即便如此,通常也会公正地12人们打交道。

答案3

这些数字是管道的索引值。正如您正确提到的那样,0 是标准输入,1 是标准输出,2 是标准错误。如果您愿意,您可以创建更多,顺便说一句,这 3 个是为您创建的用于处理流程的输入和输出的主要文件。 chevron > 允许您将数据流重定向到新的描述符。例如,如果您想抑制文件( cmd > ~/somefile.out )或什么都没有( cmd > /dev/null ),它也允许您关闭管道( cmd > &- )我会小心这一点。但您也可以执行类似 ( cmd 3>&2 2>&1 1>&2 ) 的操作来交换标准输入和标准输出。

关键是将其视为电线,就像您是旧式​​调度员一样,您从已插入某些默认位置的电线标签 0、1、2 开始,并且 > 允许您切换电线所在的位置连接到。

相关内容