有什么$ command 1>&2
作用?据我了解,这会运行command
但STDOUT
重定向到STDERR
.但我不确定具体是如何>&
运作的。
我把它看作$ command 1>&2
和$ command 2>&1
。
我认为 和1
分别是和2
的文件描述符,但我什至不确定这意味着什么。STDOUT
STDERR
我在 SO 和其他资源上发现了>&
某种重定向“东西(运算符??)”,我不确定它到底是如何工作的。它是二元运算符吗?甚至是运营商吗?
有人可以解释一下吗新手术语这是做什么的。
答案1
在该语法中,您是正确的,即1
STDOUT 和2
STDERR。它的作用是“把东西 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 通常足够聪明,知道它前面的任何数字都将是文件描述符。如果您省略其中之一,通常会假设您正在谈论STDOUT
for>
和STDIN
for <
。
所以把它放在一起:
# 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
.您可以在文件描述符下打开文件,而不是通常的三个(0
、1
和2
),但这通常是为更复杂的脚本保留的,人们通常只处理通常的三个。即便如此,通常也会公正地1
和2
人们打交道。
答案3
这些数字是管道的索引值。正如您正确提到的那样,0 是标准输入,1 是标准输出,2 是标准错误。如果您愿意,您可以创建更多,顺便说一句,这 3 个是为您创建的用于处理流程的输入和输出的主要文件。 chevron > 允许您将数据流重定向到新的描述符。例如,如果您想抑制文件( cmd > ~/somefile.out )或什么都没有( cmd > /dev/null ),它也允许您关闭管道( cmd > &- )我会小心这一点。但您也可以执行类似 ( cmd 3>&2 2>&1 1>&2 ) 的操作来交换标准输入和标准输出。
关键是将其视为电线,就像您是旧式调度员一样,您从已插入某些默认位置的电线标签 0、1、2 开始,并且 > 允许您切换电线所在的位置连接到。