参考:https://www.jb51.net/article/138686.htm
前言
Linux将所有内核对象当做文件来处理,系统用一个size_t类型来表示一个文件对象,比如对于文件描述符0就表示系统的标准输入设备STDIN,通常情况下STDIN的值为键盘,如read命令就默认从STDIN读取数据,当然STDIN的值是可以改变的,比如将其改成其他文件,这样的话想read等命令就会默认从相应的文件读取数据了。
默认标准文件描述符
每个进程启动时默认都会有三个标准的文件描述符:
- stdin 0 号描述符, 代表输入设备, 进程从它读入数据;
- stdout 1 号描述符, 进程往其中写入数据;
- stderr 2 号描述符, 进程会往其中写入错误信息;
文件描述符的操作
Shell 中对文件描述符的操作由三部分组成: (Left, Operation, Right):
- Left 可以是 0-9 的数字, 代表第 n 号文件描述符;
Left 还可以为 &, 表示同时操作 stdout 和 stderr - Right 可以是文件名或 0-9 的数字, 当 Right 是数字时必须要加上 & 符号, 表示引用第 n 号文件描述符;
Right 还可以为 &-, 此时表示关闭 Left 描述符, 例如 2<&- 表示关闭 stderr; - Operation 可以为 < 或 >;
为 < 时表示以读模式复制 Right 到 Left, 此时如果没有指定 Left 的话, 则为默认值 0;
当为 > 表示以写模式复制 Right 到 Left, 此时如果没有指定 Left 的话, 则为默认值 1;
Operation 和 Left 之间不能有空格;
当 Right 为文件名时, Operation 和 Right 可以有空格, 否则也不能有空格;
当存在多个文件描述符的操作时, 会按照从左往右的顺序依次执行. 例如通过命令 cmd 3>&1 1>&2 2>&3 3>&- 就可以交换 stdin 和 stdout.