Answers:
在&
中2>&1
只是说该号码1
是一个文件描述符,而不是文件名。在这种情况下standard output file descriptor
。
如果使用2>1
,则会将错误重定向到一个名为的文件,1
但如果使用2>&1
,则将其发送至standard output stream
。
这&>
表示将standard output
和都发送standard error
到某个地方。例如,ls <non-existent_file> &> out.file
。让我用一个例子来说明。
设定:
创建一个koko
具有以下内容的文件:
#!bin/bash
ls j1
echo "koko2"
使它可执行: chmod u+x koko
现在注意,j1
这不存在
现在运行 ./koko &> output
运行cat output
,你会看到
ls: cannot access 'j1': No such file or directory
koko2
两者,standard error
(ls: cannot access 'j1': No such file or directory
)和standard output
(koko2
),被发送到文件output
。
现在再次运行它,但是这次是这样的:
./koko > output
这样做cat output
,您只会看到koko2
类似的图像。但不是ls j1
命令输出的错误。这将被发送到standard error
您将在终端中看到的。
感谢@Byte Commander的重要说明:
请注意,command >file 2>&1
重定向的顺序很重要。如果您改写command 2>&1 >file
(通常不是您想要的),它将首先将命令重定向stdout
到文件,然后将命令重定向stderr
到现在未使用的文件stdout
,因此它将显示在终端中,您可以通过管道对其进行重定向或重定向。再次,但不会将其写入文件。
command >file 2>&1
重定向的顺序很重要。如果您command 2>&1 >file
改为写(通常不是您想要的内容),它将首先将命令的stdout重定向到文件,然后将命令的stderr重定向到其现在未使用的stdout,因此它将显示在终端中,您可以通过管道进行传输或再次重定向,但不会将其写入文件。
standard output
您将在终端中看到的。” 这不应该是“对standard error
”吗?
在[n]>&word
被称为仿型输出文件描述符(见节2.7.6 POSIX shell语言标准)。这种特殊的行为是类似Bourne外壳,包括功能ksh
,dash
以及bash
; 实际上,该标准基于Bourne shell和ksh
。展望的tcsh和csh的手册,他们显然没有提供任何复制文件描述符的能力,但是从描述中>&
,这表现为&>
在bash
(即重定向错误和正常输出到文件)。
在* nix之类的系统(包括Ubuntu)中,您经常会听到一切都是文件,或者更确切地说是文件描述符。标准输出是常量文件描述符1,标准错误是文件描述符2。因此,从> FILE 2>&1
技术上讲,它意味着将文件描述符2复制到文件描述符1上。换句话说,此答案:
2>&1告诉外壳程序给命令一个文件描述符2,它是描述符1的副本(即stderr&stdout指向相同的fd)。
此处的关键是要注意必须首先设置描述符1。因为shell以从左到右的顺序处理重定向,所以command >FILE 2>&1
告诉shell重新连接stdout command
进入FILE
,然后描述符2才能成为1的副本,即1和2指向相同的位置- FILE
。
当然,这超出了标准误差和标准输出。如该答案所示,3&>2
...您将文件描述符2复制(dup2)到文件描述符3上,如果文件描述符3已经打开,则可能将其关闭
在许多文件中,操纵文件描述符的示例是将命令的输出捕获dialog
到变量中
还值得注意的&>
是bash
。在zsh
这种情况下,其行为相同,但是根据文档,“ ...在multios的情况下,与'> word 2>&1'的作用不同”。在POSIX兼容中/bin/sh
,将命令放入后台将被视为常规重定向。另请参见,是否有在语法上不是有效的bash代码的sh代码?。
也可以看看:
&>
意思