1. 描述
在 Linux 系统中,几乎所有东西都被视为文件,包括标准输入、输出。这些被称为文件描述符(File Descriptor,简称 fd)。在程序中,我们通常通过文件描述符来引用这些文件,并进行读写操作。
在 Linux 中,文件描述符是一个非负整数,它代表着程序可以打开或使用的文件和套接字。每个打开的文件或套接字都会被分配一个文件描述符,而每个进程都有自己的文件描述符表。当程序打开一个文件或创建一个套接字时,操作系统会返回一个文件描述符,程序可以使用这个文件描述符来进行读写操作。
标准输入、输出和错误输出是 Linux 中的特殊文件描述符,它们通常被命名为 0、1 和 2。标准输入通常是键盘输入,标准输出是终端输出,而标准错误输出是错误信息的输出。
名称 | 代码 | 操作符 | 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 |
在 linux 中,>
和 >>
是用于重定向输出的特殊符号。通常情况下,>
和 >>
默认为标准输出(即文件描述符 1)的重定向,因此 > file
实际上是 1> file
的简写形式。需要注意的是,1 和 >
之间不能有空格。
另一个常见的重定向操作是 2>&1
,它表示将标准错误输出(即文件描述符 2)重定向到标准输出(即文件描述符 1)。这种重定向操作在编程中非常常见,因为它可以将错误信息与正常输出合并在一起。
在控制台下,2>&1
和 1>&2
的效果可能看起来相同,因为标准输出和标准错误输出的默认目的地都是屏幕。不过,&
在这里的作用是类似于 C 语言中的取地址操作符,用于将输出重定向到另一个文件描述符。
2. 常用举例
&> file
和 >& file
用于同时重定向标准输出(即文件描述符 1)和标准错误输出(即文件描述符 2)到指定的文件。
然而要将错误信息也重定向到标准输出上,通常使用 > file 2>&1
的方式。这种方式分为两步:首先,将标准输出重定向到文件 file 中;然后,将标准错误输出定向到标准输出。例如:
ls xxx > /dev/null 2>&1
这里第一个 >
操作的默认是 1, 所以写成 ls xxx 1> /dev/null 2>&1
是一样的。/dev/null
表示一个空设备,相当于一个黑洞,用来忽略掉输出,此外这种方式也可以,即 &-
,例如:
ls xxx 2>&-
2.1 输出重定向
Command > filename | 把标准输出重定向到一个新文件中 |
---|---|
Command >> filename | 把标准输出重定向到一个文件(追加) |
Command > filename 2>&1 | 把标准输出和错误一起重定向到一个文件中 |
Command 2> filename | 把标准错误重定向到一个文件中 |
Command 2>> filename | 把标准错误重定向到一个文件中(追加) |
Command >> filename 2>&1 | 把标准输出和错误一起重定向到一个文件中(追加) |
Command > filename 2> /dev/null | 标准输出定向到文件,屏蔽掉错误输出 |
2.2 输入重定向
Command < filename | Command 命令以 filename 文件作为标准输入 |
---|---|
Command < filename > filename2 | Command 以 filename 文件作为标准输入,以 filename 2 作为标准输出 |
Command << delimiter | 从标准输入中读入,以 delimiter 为结束符。这就是 Bash 的 HereDoc 用法 |
2.3 绑定重定向
Command >&m | 把标准输出重定向到文件描述符 m 中,如 ls >&1 |
---|---|
Command m>&n | 把往文件描述符 m 的输出重定向到文件描述符 n 上,2>71。再如上面的完整写法是 1>&m |
Command <&- | 关闭标准输入 |
Command 2>&- | 关闭标准错误输出,和 2>/dev/null 有类似功效 |