点击返回 自学Linux命令行与Shell脚本之路

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-在脚本中使用其他文件描述符的更多相关文章

  1. Linux中通过Socket文件描述符寻找连接状态介绍

    针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...

  2. 查看、修改linux系统的最大链接数限制、文件描述符限制、端口范围限制、虚拟内存等

    一.修改最大连接数 1.查看当前文件描述符的限制数目的命令: ulimit -n 2.修改文件描述符的限制数目 2.1 临时改变当前会话: ulimit -n 65536 2.2 永久变更需要下面两个 ...

  3. Linux中文件描述符fd和文件指针flip的理解

    转自:http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  4. Linux中的文件描述符与打开文件之间的关系

    Linux中的文件描述符与打开文件之间的关系 导读 内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描 ...

  5. Linux中的文件描述符与打开文件之间的关系------------每天进步一点点系列

    http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文件. ...

  6. (转)Linux中的文件描述符

    本文转自:http://blog.csdn.net/cywosp/article/details/38965239 作者:cywosp 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为 ...

  7. [转载] linux中文件描述符fd和文件指针flip的理解

    转载自http://www.cnblogs.com/Jezze/archive/2011/12/23/2299861.html 简单归纳:fd只是一个整数,在open时产生.起到一个索引的作用,进程通 ...

  8. (转)Linux中的文件描述符与打开文件之间的关系

    转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...

  9. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

随机推荐

  1. SPOJ33&POJ1934 Trip LCS

    题目传送门:https://www.luogu.org/problemnew/show/SP33 题目大意:给出两个字符串,求其LCS(最长公共子序列)的长度与具体方案(相同的串算作同一方案).数据组 ...

  2. 阿里巴巴Java开发规约插件p3c详细教程及使用感受 - 转

    http://www.cnblogs.com/han-1034683568/p/7682594.html

  3. SequenceFile文件

    SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File).目前,也有不少人在该文件的基础之上提出了一些HDFS中小文件存储的解决方案 ...

  4. P1438 无聊的数列

    P1438 无聊的数列 链接 分析: 等差数列可加,首项相加,公差相加. 代码: #include<cstdio> #include<algorithm> #include&l ...

  5. js实现随机的四则运算题目(2)-更新界面

    上次的代码提交完成后,有很多bug.比如函数会重复调用执行,每点击一次按钮都会在生成题目的下方直接生成新的题目,于是我在代码前面添加了如下的代码: function play_allE() { doc ...

  6. M2阶段团队个人贡献分

    团队个人贡献分: 徐钧鸿:53 张艺:48 黄可嵩:51 徐方宇:47 刘浩然:52 钟毅恒:49 杨伊:50

  7. M1阶段个人总结

    经过4周的开发,我们团队的第一阶段已经结束了. 这一个月来我由于其他事情较多,所以开发的工作主要交给了另外的三名同学. 我主要负责制定代码规范和工程结构,通过github来跟进项目进度,提供一些技术支 ...

  8. 《Linux内核》第七周 进程的切换和系统的一般执行过程 20135311傅冬菁

    进程的切换和系统的一般执行过程 一.内容总结与分析 进程调度与进程调度时机 进程调度需求的分类: 第一种分类方式: I/O -bound(频繁进行I/O,通常会花很多时间等待I/O操作) CPU-bo ...

  9. SE Springer小组之《Spring音乐播放器》需求分析说明书一

    软件需求说明书 软件需求说明书的编制是为了使用户和软件开发者双方对该软件的初始规定有一个共同的理解, 使之成为整个开发工作的基础. 1 引言 1.1编写目的 使用户对该软件的初始规定有一个理解,也使软 ...

  10. Android Studio中的Gradle是干什么的

    作者:ghui链接:https://www.zhihu.com/question/30432152/answer/48239946来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注 ...