重定向
UNIX 控制台程序有一个输入文件和两个输出文件(输入和输出流,以及设备,被操作系统视为文件。)这些通常分别是键盘和屏幕,但可以重定向它们中的任何一个或全部来自 - 或去 - 文件或其他程序。
STDIN
是标准输入,是程序接收交互输入的方式。STDIN
通常被赋予文件描述符 0。
STDOUT
是标准输出。无论在 STDOUT
上发出什么,都被认为是该计划的结果。STDOUT
通常被分配文件描述符 1。
STDERR
是显示错误消息的地方。通常,当从控制台运行程序时,STDERR
在屏幕上输出,与 STDOUT
无法区分。STDERR
通常被分配文件描述符 2。
重定向的顺序很重要
command > file 2>&1
将(STDOUT
和 STDERR
)重定向到文件。
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