重定向

UNIX 控制台程序有一个输入文件和两个输出文件(输入和输出流,以及设备,被操作系统视为文件。)这些通常分别是键盘和屏幕,但可以重定向它们中的任何一个或全部来自 - 或去 - 文件或其他程序。

STDIN 是标准输入,是程序接收交互输入的方式。STDIN 通常被赋予文件描述符 0。

STDOUT 是标准输出。无论在 STDOUT 上发出什么,都被认为是该计划的结果STDOUT 通常被分配文件描述符 1。

STDERR 是显示错误消息的地方。通常,当从控制台运行程序时,STDERR 在屏幕上输出,与 STDOUT 无法区分。STDERR 通常被分配文件描述符 2。

重定向的顺序很重要

command > file 2>&1

将(STDOUTSTDERR)重定向到文件。

command 2>&1 > file

仅重定向 STDOUT,因为文件描述符 2 被重定向到文件描述符 1 指向的文件(当评估语句时,它不是文件 file)。

管道中的每个命令都有自己的 STDERR(和 STDOUT),因为每个命令都是一个新进程。如果你希望重定向影响整个管道,这可能会产生令人惊讶的结果。例如这个命令(包装易读性):

$ python -c 'import sys;print >> sys.stderr, "Python error!"' \
| cut -f1 2>> error.log

将打印“Python 错误!” 到控制台而不是日志文件。而是将错误附加到要捕获的命令:

$ python -c 'import sys;print >> sys.stderr, "Python error!"' 2>> error.log \
| cut -f1