文档章节

shell中的文件描述符指定文件及使用

K
 KaZic
发布于 2015/04/16 15:19
字数 939
阅读 69
收藏 0

在linux中,从man read的帮助手册中看到了read能从文件描述符中读取内容,那么这个文件描述符到底是什么?

 -u fd  Read input from file descriptor fd.

1.先放个例子帮助大家理解

在shell中,大家应该对stdin,stdout,stderr有所了解,就是输入输出流的重定向中经常出现的那个 &1 &2.

shell将stdout指向 1 这个数字,将stdin指向 2 这个数字,将stdin指向 0 这个数字。

当然,用户可以自己定义,将这些重新指定这些数字的指向。

为了方便,我不使用系统默认的0,1,2这三个数字,我使用3来演示。

在/tmp 目录下有文件 a :

[root ~ ]$ cat /tmp/a
AAA
b
c
d
aaa
[root ~ ]$

将这个文件指向数字3:

[root ~ ]$ exec 3</tmp/a

这时候,3就成了文件 /tmp/a 的文件描述符。而在linux中一切皆为文件,所以上面提到的 0,1,2 也是对应文件的文件描述符。

现在,可以使用文件描述符读取文件:

[root ~ ]$ cat <&3
AAA
b
c
d
aaa
[root ~ ]$

只要在文件描述符前加上”&“符号即可使用(学过C语言的是不是觉得和指针很像?)。

2.文件描述符的简介

在shell中重定向的我们会用到 "<",">",">>",在上面的例子中,我们使用的是"<",所以我们只能从/tmp/a 中读取内容,要写入内容就是:

[root /tmp ]$ exec 3>/tmp/a

要读写文件是:

[root /tmp ]$ exec 3<>/tmp/a

要追加内容是:

[root /tmp ]$ exec 3>>/tmp/a

在某个文件描述符使用完后,关闭该描述符:

[root /tmp ]$ exec 3>&-        #关闭写入
[root /tmp ]$ exec 3<&-        #关闭读取
[root /tmp ] exec 3<>&-        #这样写报错了,要分开写
-bash: syntax error near unexpected token `&'

3.文件描述符使用中的一些注意点

3.1空格

在指定文件描述符的时候,"<",">",">>"这些符号的前面(和数字之间)不能有空格,否则就不是指定文件描述符了;这些符号后面可以有空格(有例外,后面提到)

[root ~ ]$ exec 3</tmp/a        #没有空格可以
[root ~ ]$ exec 3< /tmp/a        #后面有空格可以
[root ~ ]$ exec 3 </tmp/a        #前面有空格,奇怪的事情发生了 :)
-bash: exec: 3: not found
[root ~ ]$ logout

符号后加空格有时候也会出错:

[root /tmp ]$ exec 3> &-        #在关闭文件描述符的时候,后面跟空格也出错了
-bash: syntax error near unexpected token `&'

所以建议大家,这些符号前后都不要跟空格

3.2多个session里同时指定

文件描述符并不是session独立的,但也不是session之间完全共享的:

[root /tmp ]$ w        #当前系统共登录了两个用户,都是root
 15:10:41 up 102 days,  5:34,  2 users,  load average: 0.04, 0.01, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.100.108   14:25    0.00s  0.10s  0.00s w
root     pts/1    172.16.100.108   15:10    3.00s  0.05s  0.05s -bash
[root /tmp ]$          #一个root在/tmp 目录,另一个在/root 目录,以便区分
[root ~ ]$ cat /tmp/a
AAA
b
c
d
aaa
[root ~ ]$ cat /tmp/b        #两个文件的内容
haha
[root ~ ]$ 

#在一个session中定义文件描述符3
[root /tmp ]$ exec 3</tmp/a
[root /tmp ]$ cat <&3
AAA
b
c
d
aaa

#之后在另一个session使用
[root ~ ]$ cat <&3
-bash: 3: Bad file descriptor

#再返回第一个session中使用
[root /tmp ]$ cat <&3
[root /tmp ]$             #结果为空

其他session不仅不能使用,一旦使用还会对原session造成影响,所以在使用的时候注意其他的session的影响。



© 著作权归作者所有

K
粉丝 0
博文 9
码字总数 5181
作品 0
杭州
私信 提问
Linux标准输入输出及文件描述符

1.标准文件描述符0,1,2 1.1 STDIN标准输入 对终端界面来说,标准输入时键盘;也可以使用重定向符号<,用重定向指定的文件来代替标准输入文件描述符。 1.2 STDOUT标准输出 在终端界面上,标准...

Caishu
2016/05/16
425
0
linux shell数据重定向(输入重定向与输出重定向)详细分析

导读小文:【http://www.ibm.com/developerworks/cn/linux/l-iotips/】 技巧:Linux I/O重定向的一些小技巧 简介: Linux I/O 重定向虽然很简单,但在脚本编写、系统管理时却要常常打交道,搞...

无明时空
2013/03/06
0
0
第八章 Shell标准输入、输出和错误

文件描述符(fd):文件描述符是一个非负整数,在打开现存文件或新建文件时,内核会返回一个文件描述符,读写文件也需要使用文件描述符来访问文件。 内核为每个进程维护该进程打开的文件记录...

李振良OK
2017/02/15
0
0
文件句柄(file handles) & 文件描述符(file descriptors)

1.概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦。在linux操作系...

u013256816
2017/03/07
0
0
如何把一个运行完好的Kafka搞崩溃

版权声明:本文为博主原创文章,未经博主朱小厮允许不得转载。 https://blog.csdn.net/u013256816/article/details/82804525 欢迎支持《RabbitMQ实战指南》以及关注微信公众号:朱小厮的博客...

朱小厮
2018/09/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

买卖股票的最佳时机-LeetCode

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。 如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。 注意你不能在买入股票前卖...

事儿爹
34分钟前
2
0
mysql根据分隔符进行字段拆分

虽然已经有很多类似的写法,我这里还是自己写一写,有些分隔符分出的列数是不固定的,这时候怎么根据分隔符拆分出多列呢 insert into tpems.sp_questions_bank (id, title, option_a, option...

无知的小狼
43分钟前
1
0
vue+antdesign模态框实现父子组件之间传值

vue中实现父子组件间单向数据流传递比较方便,子组件通过prop接收父组件传递过来的值,父组件通过监听子组件emit出的函数接收子组件传递的值。 1、父组件向子组件传值(prop) 父组件先绑定值...

苇草66083
45分钟前
6
0
JDBC直接读取properties,连接数据库的util类

完整代码如下:拼凑的代码,源代码不知道从哪来的了。见谅! 使用的话直接在自己的service或dao注入 package com.javafast.util;import com.alibaba.druid.pool.DruidDataSource;import co...

S三少S
58分钟前
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部