自学Linux Shell14.2-在脚本中使用其他文件描述符
14.2-在脚本中使用其他文件描述符
在脚本中重定向输入和输出,并布局限于以上讲的3个默认的文件描述符,shell最多可以有9个打开的文件描述符。这节介绍在脚本中使用其他文件描述符。
1.文件描述符的操作
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 >& >& >& >&-
就可以交换 stdin 和 stdout.
2 I/O重定向的常用用法
- command > filename 把标准输出重定向到一个新文件中
 - command >> filename 把标准输出重定向到一个文件中(追加)
 - command 1 > fielname 把标准输出重定向到一个文件中
 - command > filename 2>&1 把标准输出和标准错误一起重定向到一个文件中
 - command 2 > filename 把标准错误重定向到一个文件中
 - command 2 >> filename 把标准输出重定向到一个文件中(追加)
 - command >> filename 2>&1 把标准输出和标准错误一起重定向到一个文件中(追加)
 - command < filename >filename2 把command命令以filename文件作为标准输入,以filename2文件作为标准输出
 - command < filename 把command命令以filename文件作为标准输入
 - command << delimiter 把从标准输入中读入,直至遇到delimiter分界符
 - command <&m 把文件描述符m作为标准输入
 - command >&m 把标准输出重定向到文件描述符m中
 - command <&- 把关闭标准输入
 - command %n%c file command 输出重定向的命令 ,%n 文件描述符,默认值为1,%c 重定向符 ,file 目标文件。
 
3. exec命令的介绍
exec命令用于调用并执行指令的命令。exec命令通常用在shell脚本程序中,可以调用其他的命令。如果在当前终端中使用命令,则当指定的命令执行完毕后会立即退出终端
exec用法:
- &n :代表描述符代表的文件
 - > < :代表以什么形式使用描述符
 - exec 8<&2 :描述符8以读取方式打开标准错误对应的文件
 - exec &>log:把标准输入错误打开文件log
 - exec 8<&- :关闭描述符8
 
4. 列出打开的文件描述符lsof
lsof会列出整个linux系统打开的所有文件描述符,,命令为隐藏状态。
很多的linux系统中(如Fedora),lsof命令位于/usr/sbin
lsof
command PID USER FD type DEVICE SIZE NODE NAME
init root cwd DIR , /
init root rtd DIR , /
init root txt REG , /sbin/init
init root mem REG , /lib64/ld-2.5.so
init root mem REG , /lib64/libc-2.5.so
init root mem REG , /lib64/libdl-2.5.so
init root mem REG , /lib64/libselinux.so.
init root mem REG , /lib64/libsepol.so.
init root 10u FIFO , /dev/initctl
migration root cwd DIR , /
migration root rtd DIR , /
migration root txt unknown /proc//exe
ksoftirqd root cwd DIR , /
ksoftirqd root rtd DIR , /
ksoftirqd root txt unknown /proc//exe
migration root cwd DIR , /
migration root rtd DIR , /
migration root txt unknown /proc//exe
ksoftirqd root cwd DIR , /
ksoftirqd root rtd DIR , /
ksoftirqd root txt unknown /proc//exe
events/ root cwd DIR , /
events/ root rtd DIR , /
events/ root txt unknown /proc//exe
events/ root cwd DIR , /
lsof输出各列信息的意义如下:
- COMMAND:进程的名称
 - PID:进程标识符
 - USER:进程所有者
 - FD:文件描述符,应用程序通过文件描述符识别该文件
 - TYPE:文件的类型,DIR表示字符型,BLK表示块型,DIR表示目录,REG表示常规文件
 - DEVICE:设备的设备号
 - SIZE:如果有的话,表示文件的大小
 - NODE:本地文件的节点号
 - NAME:文件名
 
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:
- u:表示该文件被打开并处于读取/写入模式。
 - r:表示该文件被打开并处于只读模式。
 - w:表示该文件被打开并处于。
 - 空格:表示该文件的状态模式为unknow,且没有锁定。
 - -:表示该文件的状态模式为unknow,且被锁定。
 
同时在文件状态模式后面,还跟着相关的锁:
- N:for a Solaris NFS lock of unknown type;
 - r:for read lock on part of the file;
 - R:for a read lock on the entire file;
 - w:for a write lock on part of the file;(文件的部分写锁)
 - W:for a write lock on the entire file;(整个文件的写锁)
 - u:for a read and write lock of any length;
 - U:for a lock of unknown type;
 - x:for an SCO OpenServer Xenix lock on part of the file;
 - X:for an SCO OpenServer Xenix lock on the entire file;
 - space:if there is no lock.
 
5. 记录消息tee
tee用于将数据重定向到文件,另一方面还可以提供一份重定向数据的副本作为后续命令的stdin。简单的说就是把数据重定向到给定文件和屏幕上。
- 默认情况下,tee命令在每次使用时候覆盖输出文件内容
 - -a , 将数据追加到文件中
 - -i ,忽略终端信号
 
自学Linux Shell14.2-在脚本中使用其他文件描述符的更多相关文章
- Linux中通过Socket文件描述符寻找连接状态介绍
		
针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...
 - 查看、修改linux系统的最大链接数限制、文件描述符限制、端口范围限制、虚拟内存等
		
一.修改最大连接数 1.查看当前文件描述符的限制数目的命令: ulimit -n 2.修改文件描述符的限制数目 2.1 临时改变当前会话: ulimit -n 65536 2.2 永久变更需要下面两个 ...
 - Linux中文件描述符fd和文件指针flip的理解
		
转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
 - Linux中的文件描述符与打开文件之间的关系
		
Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...
 - Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列
		
http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...
 - (转)Linux中的文件描述符
		
本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...
 - [转载] linux中文件描述符fd和文件指针flip的理解
		
转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...
 - (转)Linux中的文件描述符与打开文件之间的关系
		
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
 - Linux文件描述符与打开文件之间的区别(转载)
		
转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为: ...
 
随机推荐
- CF1097D Makoto and a Blackboard 积性函数、概率期望、DP
			
传送门 比赛秒写完ABC结果不会D--最后C还fst了qwq 首先可以想到一个约数个数\(^2\)乘上\(K\)的暴力DP,但是显然会被卡 在\(10^{15}\)范围内因数最多的数是\(978217 ...
 - Android下WPS打开Excel2007版也有问题
			
继上次解决微软office Android版Excel下载并打开Excel文件修改后(http://anforen.com/wp/2017/11/excel-android-mobile/),再上传出 ...
 - WPF中TreeView.BringIntoView方法的替代方案
			
原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...
 - mybatis 反射bean规则
			
1,根据查询字段名,寻找 bean变量名设置,变量可为私有属性 2,根据查询字段名 set方法名,设置bean属性 此方法 为 ‘set‘+字段名,大小写忽略,即 方法set后面第一个字母可以是大小写 ...
 - C# 定时器和队列结合,卖包子啦,Timer、 AutoResetEvent、 ManualResetEvent
			
再你们得到源码之前,我先做个广告:张家港杰德机械/张家港三兴华轩机械是我一朋友的公司,希望需要做净水,灌装机,拔盖机,封口机,传送带等的朋友光顾. 张家港杰德机械有限公司:http://www.jie ...
 - $\mathfrak {reputation}$
			
\(\mathfrak {reputation}\) 举世盛名 身败名裂
 - HNOI2019 JOJO
			
HNOI2019 JOJO jojo这个坑填上了,然鹅还有序列这个题啊啊啊啊啊啊 膜 可持久化这个东西没有强制在线就是假的,直接建树dfs就行了 这题是kmp的加强版,每次会加一堆相同的数进来 先想一 ...
 - 如何使用串口来给STM32下载程序
			
前言 第一次学习STM32的时候,不知道有调试器这个东西,所以一直是通过串口来给STM32下载程序,下载速度也还算可以,一般是几秒钟完成.后来用了调试器,可以直接在Keil环境下进行下载,而且还可以进 ...
 - linux-文件流4种读取方式
			
第二种方式 第三种 第四种: 小括号在管道符的右边开辟了两个子进程 大括号在管道符的右边开辟了一个子进程, export 用来导出子进程的 num 还可以借助外部文件进行 七步扩展:
 - oracle数据恢复方法
			
https://www.cnblogs.com/hqbhonker/p/3977200.html