免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1289 | 回复: 8
打印 上一主题 下一主题

[文本处理] 重定向问题 [复制链接]

论坛徽章:
1
2015亚冠之吉达阿赫利
日期:2015-09-09 16:42:38
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2017-05-25 13:47 |只看该作者 |倒序浏览
本帖最后由 jiaogeshahaone 于 2017-05-25 13:48 编辑

echo "1234567890" > file
exec 3<>file
read -n 4 <&3
echo -n . >&3  
exec 3>&-  
cat file # 结果会是:1234.567890为啥不是个.?而是这么个结果?



论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-12-17 06:20:00
2 [报告]
发表于 2017-05-25 15:34 |只看该作者
echo "1234567890" > file    ####向file写入 1234567890
exec 3<>file                      ####以读写的方式绑定到文件描述符“3”中   
read -n 4 <&3                   ####从&3中读取4个字符(& 是在重定向里用来表示文件描述符,&0 表示标准输入。如果不用 & 那就会被认为是以 0 为名字的文件了,所以这其实也是一个语法的规定而已。)
echo -n . >&3                   ###向&3中以横向增加一个点“.”(因为之前设置了'read -n 4',所以这个点将加在第四位后面,即1234.56;如果是“..”,那么就是1234..)
exec 3>&-                        #### 关闭输出文件描述符3  



so   cat file # 结果会是:1234.567890

论坛徽章:
1
2015亚冠之吉达阿赫利
日期:2015-09-09 16:42:38
3 [报告]
发表于 2017-05-25 15:50 |只看该作者
回复 2# vagrant_1220

前面都很好理解echo -n . >&3 问题在这里,是如何将1234.567890写入文件的?
在此之前,文件内容是1234567890,那么执行这条后 为啥 不是 . 覆盖了原来的文件内容呢

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-12-17 06:20:00
4 [报告]
发表于 2017-05-25 17:17 |只看该作者
之前的回复中的覆盖的字符‘5’没有删除,正常的输出应该是1234.67890,你的写入的字符‘.’ 覆盖了5 。
echo -n . >&3 问题在这里,是如何将1234.567890写入文件的?  该操作只是在5的位置写入了一个‘.’ 覆盖了5

论坛徽章:
1
2015亚冠之吉达阿赫利
日期:2015-09-09 16:42:38
5 [报告]
发表于 2017-05-25 17:42 |只看该作者
回复 4# vagrant_1220

为啥只覆盖了‘5‘呢,不是应该全都覆盖了吗

论坛徽章:
1
2015亚冠之吉达阿赫利
日期:2015-09-09 16:42:38
6 [报告]
发表于 2017-05-26 09:54 |只看该作者
@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主@版主

论坛徽章:
1
程序设计版块每日发帖之星
日期:2015-12-17 06:20:00
7 [报告]
发表于 2017-05-26 14:15 |只看该作者
用户自定义文件描述符的创建有三种形式:
    1)只读方式的文件描述符;
    2)截断模式创建写方式的文件描述符;
    3)追加模式创建写方式的文件描述符;
   (也可以读写组合)
以读方式创建文件描述符:
使用 "  exec descriptor<file Name " 的模式创建只读模式的用户自定义文件描述符;
使用 "&descriptor" 的模式引用文件描述符;

注意,此时每个操作都在维护设一个文件的偏移量,默认是0。
举个例子
[root@db test]# exec 3<a.txt
[root@db test]# cat a.txt
line 1
line 2
[root@db test]# head -1 <&3
line 1
[root@db test]# head -1 <&3  (第一行怎么显示成了第二行,因为上一个操作修改了文件的偏移量了)
line 2
[root@db test]# echo "line 3" >&3
-bash: echo: write error: 错误的文件描述符
(写是拒绝的,因为是只读模式)

######################
以截断模式创建写方式的文件描述符:

所谓截断模式,就是相当于重新创建文件,文件之前的内容将会丢失;
使用 " exec descriptor>file Name " 的模式创建截断模式的用户自定义的写方式的文件描述符;
使用 "&descriptor" 的模式引用文件描述符;
写方式的文件描述符只要一次打开便可多次写入,并且后续的写入操作会一直追加到文件的结尾,但是文件打开之前的内容就会丢失;


###################

以追加模式创建写方式的文件描述符:



所谓追加模式,就是打开文件进行写操作,文件之前的内容不会丢失,写操作写入的内容以追加方式添加到文件的末尾;
使用 " exec descriptor>>file Name " 的模式创建追加模式的用户自定义的写方式的文件描述符;
使用 "&descriptor" 的模式引用文件描述符;
写方式的文件描述符只要一次打开便可多次写入,并且后续的写入操作会一直追加到文件的结尾;


#############

你的问题就是采用读写方式创建的文件描述符,读修改了文件的位置偏移量,影响写的位置。


论坛徽章:
0
8 [报告]
发表于 2017-05-26 16:37 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
2015亚冠之吉达阿赫利
日期:2015-09-09 16:42:38
9 [报告]
发表于 2017-06-06 14:07 |只看该作者
回复 7# vagrant_1220


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP