shell编程(二十一)文件描述符

一   文件描述符

1) 文件描述符'File descriptor'是计算机的一个术语

2) 是一个用于表述'指向文件的引用'的'抽象化'概念

明确一点:用户通过'fd'对"文件"进行'读、写'操作

文件'广义':'普通'文件、目录、'管道pipe'、'FIFO(命名管道)'、socket、终端、'字符、块'设备

二  句柄

说明: 句柄'不在'本章节的考虑范围,本节讲解的是'Unix|Linux'下的文件句柄

补充: 'Perl语法'文件句柄是'文件描述符fd'的进一步封装;'C语言'中的文件句柄'类同'

附加: '操作系统'层面和'编程语言'层面的句柄'区别'

三   文件描述符文件进程间的关系

说明:由于涉及'os'、'内核'、'C语言',本章考虑的是'shell'相关的,故'不讲'解

相关参考 

四    重定向文件描述符

备注: 只要是'读、写'都会涉及'syscall'

思考: shell的"哪些操作"会导致'打开'文件?

Too many open files 

4.1   Bash初始分配的文件描述符

 

4.2   基础重定向操作 

4.3  exec

exec指令是linux shell自带的指令,可以利用此指令'修改',保存'当前进程'的'文件描述符指向'

4.3.1  引入 

需求:想让shell下的'所有命令'都向'某文件写数据'呢?

做法:那么就在bash下'修改fd=1的目标'即可

4.3.2  open file  打开文件

(1)基础

理解:echo "hello" >wzj.log命令

  1) shell会打开wzj.log文件并将'fd=1关联'到该文件

  2) 当echo进程运行时会'继承'Shell的'fd=1'以及它关联的wzj.log属性,于是'echo的标准输出'就会输出到wzj.log中

(2) 手动打开文件

exec N<> FILENAME

说明:'<'标准输入"读"、'>'标准输出"写"、'<>'标准输入、输出"读写"

exec 6<> /tmp/wzj.log

4.3.3  close file 关闭 

磁盘清理空间不释放 解决方案

进程打开文件描述符的上限

用户级和系统级的fd限制

"关闭"文件描述符的方式

exec N>&-

exec N<&-

备注:如果是用'exec N<>FILENAME'打开的文件,则上面两种方式'都能'关闭N

4.3.4   fd duplicate  文件描述符复制

            文件描述符的'复制'语法

[exec] [M]>&N   # "省略"M时,默认M=1,即标准输出

[exec] [M]<&N   # "省略"M时,默认M=0,即标准输入

备注:"M"是'new'的文件描述符,"N"是'old'的文件描述符

说明:

  1) 上面echo命令中的'fd dup'是"临时"的,echo退出后'因'回到了Shell进程

  2) 使得fd=1又"重新关联"到/dev/stdout,也即当前终端.

修改后效果:即使'之后'的命令中'不指定'重定向,它们的输出、输入也会是"wzj.log"

  

4.3.5    fd  move  移动

文件描述符的'移动过程':表示'先复制'源文件描述符,'再删除'源文件描述符

[exec] [M]>&N-    # 省略M时,默认M=1
[exec] [M]<&N-    # 省略M时,默认M=0

+++++++++++++++"等价效果"+++++++++++++++

[exec] [M]>&N;N>&-    # 省略M时,默认M=1
[exec] [M]<&N;N<&-    # 省略M时,默认M=0

解读:先fd dup得到'fd=N的副本'fd=M,同时'关闭'fd=N.

效果:这就'实现了'从fd=N关联文件FILE"变成"fd=M关联文件FILE.

4.3.6    防止文件描述符冲突

类似'perl文件句柄'用'变量表示' -->'bash4.1+'支持

"关闭"文件描述符:exec {tmp_alog}>&-

 4.3.7  read文件描述符读取数据

也即:放到'()'中即可

 五   shell文件描述符小结

++++++++++++文件描述符++++++++++++

我们在简单地用'<或>'时,相当于使用 "0< 或 1>"

* cmd > file
把cmd命令的输出重定向到文件file中.如果file已经存在,则'清空'原有文件,使用bash的noclobber选项可以防止复盖原有文件.

* cmd >> file
把cmd命令的输出'重定向(append)'到文件file中,如果file已经存在,则把信息加在原有文件後面.

* cmd < file
使cmd命令从file读入

* cmd << text
从命令行读取输入,直到一个与text相同的行结束.除非使用引号把输入括起来,此模式将对输入内容进行shell变量替换.如果使用<<- ,则会忽略接下来输入行首的tab,结束行也可以是一堆tab再加上一个与text相同的内容,可以参考後面的例子.

* cmd <<< word
把'字符串'word(而不是文件word)和后面的换行作为输入提供给cmd.

* cmd <> file
以'读写模式'把文件file重定向到输入,文件file不会被破坏.仅当应用程序利用了这一特性时,它才是有意义的.

* cmd >| file
功能同>,但即便在设置了noclobber时也会复盖file文件,注意用的是|而非一些书中说的!,目前仅在csh中仍沿用>!实现这一功能.

: > filename      把文件"filename"截断为0长度.# 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).

cmd >&n  把输出送到文件描述符n -->前面'省略1'
cmd m>&n 把输出到文件符m的信息'重定向'到文件描述符n
cmd >&-  关闭标准输出
cmd <&n  输入来自文件描述符n
cmd m<&n m来自文件描述n
cmd <&-  '关闭'标准输入
cmd <&n- '移动'输入文件描述符n而非复制它.
cmd >&n- 移动输出文件描述符n而非复制它.

注意: >&实际上复制了文件描述符,这使得cmd > file 2>&1与cmd 2>&1 >file的效果不一样.
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值