输出重定向到底意味着什么?
我看到command 1> out
或2>&1
来重定向stderr,但有时我也看到&>
本身,等等。
理解的最佳方式是什么?它究竟意味着什么?
&
2>&1
简单地说数字1
是文件描述符而不是文件名。 在这种情况下, standard output file descriptor
。
如果使用2>1
,则会将错误重定向到名为1
的文件,但如果使用2>&1
,则会将其发送到standard output stream
。
这个&>
表示在某处发送standard output
和standard error
。 例如, ls
。 让我用一个例子来说明这一点。
建立:
-
使用以下内容创建文件
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
,因此它将显示在终端,您可以管道或重新定向它,但它不会写入文件。
> FILE 2>&1
和&> FILE
是等效的。 见8.2.3.2。 在Bash初学者指南中 重定向错误 第8章
[n]>&word
称为复制输出文件描述符 (参见POSIX Shell语言标准的2.7.6节 )。 这种特殊行为是类似bourne的shell的特征,包括ksh
, dash
和bash
; 实际上,该标准基于Bourne shell和ksh
。 查看tcsh和csh手册,他们显然没有提供复制任何文件描述符的function,但是从>&
的描述中,这在bash
表现为&>
(即,将错误和正常输出重定向到文件)。
在* nix之类的系统中,包括Ubuntu,你经常听到一切都是文件,或者说是文件描述符 。 标准输出是常量文件描述符1,标准错误是文件描述符2.因此, > FILE 2>&1
技术上意味着将重复文件描述符2放到文件描述符1上。换句话说, 这个答案 :
2>&1告诉shell给命令一个文件描述符2,它是描述符1的副本。(即stderr&stdout指向同一个fd)。
这里的关键是要注意必须首先设置描述符1。 因为shell按从左到右的顺序处理重定向,所以command >FILE 2>&1
告诉shell重新连接stdout以使command
首先进入FILE
,然后只有描述符2才能成为1的副本,即1和2指向同一位置- FILE
。
这当然超出了标准误差和标准输出。 如本答案所示 ,做3&>2
…你将(dup2)filedescritor 2复制到filedescriptor 3上,如果它已经打开,可能会关闭filedescriptor 3
操作文件描述符的示例(其中之一)是将dialog
命令的输出捕获到变量中
值得注意的是&>
特定于bash
。 在zsh
这表现相同,但根据文档,“……在存在multios时与’> word 2>&1’的效果不同”。 在POSIX compliance /bin/sh
,这将被视为常规重定向,并将put命令放入后台。 另请参阅, 是否有任何sh代码不是语法上有效的bash代码? 。
也可以看看:
- Greg的Wiki:文件描述符