输出重定向到底意味着什么?

我看到command 1> out2>&1来重定向stderr,但有时我也看到&>本身,等等。

理解的最佳方式是什么?它究竟意味着什么?

& 2>&1简单地说数字1是文件描述符而不是文件名。 在这种情况下, standard output file descriptor

如果使用2>1 ,则会将错误重定向到名为1的文件,但如果使用2>&1 ,则会将其发送到standard output stream

这个&>表示在某处发送standard outputstandard error 。 例如, ls &> out.file 。 让我用一个例子来说明这一点。

建立:

  1. 使用以下内容创建文件koko

     #!bin/bash ls j1 echo "koko2" 
  2. 使其可执行: chmod u+x koko

  3. 现在请注意, j1不存在

  4. 现在运行./koko &> output

  5. 运行cat output ,你会看到

     ls: cannot access 'j1': No such file or directory koko2 

standard errorls: cannot access 'j1': No such file or directory )和standard outputkoko2 )都被发送到文件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的特征,包括kshdashbash ; 实际上,该标准基于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:文件描述符