一、文件描述符
在Linux系统中,0、1、2是一个文件描述符,分别代表stdin、stdout、stderr。
- 理解:每个程序在运行后,都会至少打开三个文件描述符,分别是0:标准输入;1:标准输出;2:标准错误。
- 通过查看/proc/进程id/fd下的内容,可了解进程打开的文件描述符信息
名称 | 代码 | 操作符 | Linux 下文件描述符(Debian 为例) |
---|---|---|---|
标准输入(stdin) | 0 | <、<< | /dev/stdin -> /proc/self/fd/0 -> /dev/pts/0 |
标准输出(stdout) | 1 | >、>>、1>、 1>> | /dev/stdout -> /proc/self/fd/1 -> /dev/pts/0 |
标准错误输出(stderr) | 2 | 2>、2>> | /dev/stderr -> /proc/self/fd/2 -> /dev/pts/0 |
二、2>&1
含义:将stderr重定向输出到stdout
- &表示重定向目标是一个文件描述符,而不是普通文件
- 1>一般简写为
>
- >log 2>&1 等价于 &>log或者 >&log
三、为什么2>&1要放在后面?
对比1:command 2>&1 > out.file
等价于:command 2>&1 1>out.file
结果:stdout重定向输出至out.file,stderr输出至屏幕
exec:command
--- +-----------------------+ standard input ( 0 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard output ( 1 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard error ( 2 ) ---->| /dev/pts/5 | --- +-----------------------+
exec:2>&1
--- +-----------------------+ standard input ( 0 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard output ( 1 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard error ( 2 ) ---->| /dev/pts/5 | --- +-----------------------+
exec:> out.file
--- +-----------------------+ standard input ( 0 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard output ( 1 ) ---->| file | --- +-----------------------+ --- +-----------------------+ standard error ( 2 ) ---->| /dev/pts/5 | --- +-----------------------+
对比2:command > out.file 2>&1
等价于:command 1> out.file 2>&1
结果:stdout和stderr 重定向输出至out.file
exec:> out.file
--- +-----------------------+ standard input ( 0 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard output ( 1 ) ---->| file | --- +-----------------------+ --- +-----------------------+ standard error ( 2 ) ---->| /dev/pts/5 | --- +-----------------------+
exec:> 2>&1
--- +-----------------------+ standard input ( 0 ) ---->| /dev/pts/5 | --- +-----------------------+ --- +-----------------------+ standard output ( 1 ) ---->| file | --- +-----------------------+ --- +-----------------------+ standard error ( 2 ) ---->| /dev/pts/5 | --- +-----------------------+