Rob*_*lls 37

从技术上讲,它将stderr复制或复制到stdout上.

通常你不需要exec来执行此操作.exec与文件描述符的更典型用法是指示您要将文件分配给未使用的文件描述符,例如

exec 35< my_input

BTW不要忘记管道到文件时的声明顺序很重要,所以

ls > mydirlist 2>&1
Run Code Online (Sandbox Code Playgroud)

将工作,因为它将stdout和stderr指向文件mydirlist,而命令

ls 2>&1 > mydirlist
Run Code Online (Sandbox Code Playgroud)

仅指示stdout而不是stderr来归档mydirlist,因为在stdout被重定向到mydirlist之前stderr被制作了stdout的副本.

编辑:这是shell从左到右扫描的方式.所以在第二个说"将stdout发送到stdout"之前,请先阅读"将stdout发送到mydirlist".然后读第一个说"将stdout发送到文件mydirlist"然后它说"将stderr复制到我设置的stdout".我知道.这完全不直观!


Bri*_*lor 32

我在"2>&1"上看到的更好的文章之一Bash One-Liners解释,第三部分:所有关于重定向的内容.

但是目前这个问题的答案未能提供的是为什么你想在一个普通的"执行"之后做这个.由于exec命令的bash手册页说明:"如果未指定命令,则任何重定向都会在当前shell中生效".

我写了一个简单的脚本out-and-err.py,它将一行输出写入stdout,另一行写入stderr:

#!/usr/bin/python
import sys
sys.stdout.write('this is stdout.\n')
sys.stderr.write('this is stderr.\n')
Run Code Online (Sandbox Code Playgroud)

然后我将它包装在一个名为out-and-err.sh的shell脚本中,其中包含"exec 2>&1":

#!/bin/bash
exec 2>&1
./out-and-err.py
Run Code Online (Sandbox Code Playgroud)

如果我只运行python脚本,stdout和stderr是分开的:

$ ./out-and-err.py 1> out 2> err
$ cat out
this is stdout.
$ cat err
the is stderr.
Run Code Online (Sandbox Code Playgroud)

但是如果我运行shell脚本,你可以看到exec在之后处理了所有事情的stderr:

$ ./out-and-err.sh 1> out 2> err
$ cat out
this is stdout.
this is stderr.
$ cat err
$
Run Code Online (Sandbox Code Playgroud)

如果你的包装shell脚本不只是一个python命令,并且你需要将所有输出组合成stdout,那么执行"exec 2>&1"将使你很容易.

  • 很棒的答案,其他人未能解释重定向在整个 shell(或脚本)中有效!这个例子很清楚。 (2认同)

Cha*_* Ma 14

它将标准错误与标准输出联系起来

2是stderr和1为stdout.当您运行程序时,您将在stdout中获得正常输出,但任何错误或警告通常都会发送到stderr.例如,如果要将所有输出传递给文件,首先将stderr与stdout结合使用是很有用的2>&1.

  • 在没有命令的情况下调用exec不一定是隐藏的功能(它在bas doc中),但是对我来说还是新的。有趣的事.. (2认同)