文件描述符在 bash 中比较少用, 从 0 开始用户表示进行的数据流, 0 表示标准输入, 1 表示标准输出, 2 表示标注错误输出, 其他从 3 开始. 最为常用的场景是将错误消息输出到某个文件, 可以加上 2>file 到我们的命令中.
我们来看下面一个脚本的例子:
command> logfile 2>&1 &
>logfile, 表示 command 的标准输出重定向至文件 logfile 中, 2>&1, 匹配 n>&m, 表示文件描述字 2(command 的标准错误输出)将 copy 一份采用文件描述字 1(即标准输出), 由于标准输出已经重定向 logfile, 这份 copy 也见将重定向至文件 lofgile. 我们可以用 "abcd> logfile 2>&1 &" 来验证这个效果. 最后 & 表示后台运行的方式. 这样命令表示在后台运行 command, 而它的标准输出和错误输出均重定向到 logfile 文件中. 下面可达到类似的效果:
command 2>&1 | tee logfile &
错误输出同样适用标准输出, 通过 pipe 方式, 见他们作为输入执行 tee logfile.tee 命令将它的标准输入 copy 至他的标准标准输出以及参数所带的文件中. 和上面的命令不一眼这里即会在 stdout 和 logfile 中同时输出.
其他文件描述字的重定向, 例如<&n, 通常用于从多个文件中读入或者写出.
<&- , 表示强制关闭标准输入>&- , 表示强制关闭标准输出 1> , 等同于> 0< , 等同于 < linux shell 数据重定向 (输入重定向与输出重定向) 详细分析, 在了解重定向之前, 我们先来看看 linux 的文件描述符.
linux 文件描述符: 可以理解为 linux 跟踪打开文件, 而分配的一个数字, 这个数字有点类似 C 语言操作文件时候的句柄, 通过句柄就可以实现文件的读写操作. 用户可以自定义文件描述符范围是: 3-num, 这个最大数字, 跟用户的: ulimit -n 定义数字有关系, 不能超过最大值.
linux 启动后, 会默认打开 3 个文件描述符, 分别是: 标准输入 standard input 0, 正确输出 standard output 1, 错误输出: error output 2
以后打开文件后. 新增文件绑定描述符可以依次增加. 一条 shell 命令执行, 都会继承父进程的文件描述符. 因此, 所有运行的 shell 命令, 都会有默认 3 个文件描述符.
一个命令执行了:
先有一个输入: 输入可以从键盘, 也可以从文件得到
命令执行完成: 成功了, 会把成功结果输出到屏幕: standard output 默认是屏幕
命令执行有错误: 会把错误也输出到屏幕上面: standard error 默认也是指的屏幕
文件输入输出由追踪为一个给定的进程所有打开文件的整数句柄来完成. 这些数字值就是文件描述符. 最为人们所知的文件米描述符是 stdin, stdout 和 stderr, 文件描述符的数字分别是 0,1 和 2. 这些数字和各自的设备是保留的. 一个命令执行前, 先会准备好所有输入输出, 默认分别绑定(stdin,stdout,stderr), 如果这个时候出现错误, 命令将终止, 不会执行. 命令解析过程, 可以参考: Linux Shell 通配符, 元字符, 转义符使用实例介绍
这些默认的输出, 输入都是 linux 系统内定的, 我们在使用过程中, 有时候并不希望执行结果输出到屏幕. 我想输出到文件或其它设备. 这个时候我们就需要进行输出重定向了.
来源: http://www.bubuko.com/infodetail-2586079.html