Chinaunix首页 | 论坛 | 博客
  • 博客访问: 103168203
  • 博文数量: 19283
  • 博客积分: 9968
  • 博客等级: 上将
  • 技术积分: 196062
  • 用 户 组: 普通用户
  • 注册时间: 2007-02-07 14:28
文章分类

全部博文(19283)

文章存档

2011年(1)

2009年(125)

2008年(19094)

2007年(63)

分类:

2008-04-19 14:32:42

作者:r2007   
先看例子:

 
r2007@www r2007 $ (echo -n 123456;sleep 1;echo -n abc >&2;sleep 1;echo -n 789)>puzzle 2>puzzle
r2007@www r2007 $ cat puzzle
abc456789
r2007@www r2007 $ (echo -n 123456;sleep 1;echo -n abc >&2;sleep 1;echo -n 789)>puzzle 2>&1
r2007@www r2007 $ cat puzzle
123456abc789
为了强调每个输出都是step by step,所以加了sleep命令,其实可以省略。(echo ....)等同于一个cmd命令,在这里用一组echo命令是为了能清晰的看到整个操作过程。
第一种用法实际上同时打开2次puzzle文件。过程如下:
>puzzle ---- 打开puzzle文件(打开文件的操作会在核心中产生一个数据结构-假设叫做foo结构,其中有很多参数,比如file position-以下简称fp,就是其中之一),然后fd1(标准输出)保存着这个指针(具体结构没做深入分析,姑且简化为保存了一个指针),总而言之,通过fd1可以引用到这个核心中的数据结构。
2>puzzle --- 基本同上,再次打开这个文件,核心中会产生一个新的数据结构,同时fd2(标准错误输出)保存了这个结构的指针。
一开始,这两个foo结构中的fp都是0,第一个echo在puzzle文件写入了123456,同时fd1所指向的foo结构中的fp变为6,然后第二个echo要在puzzle文件写入abc,但是它得到的fp是fd2所指向的foo结构中的fp,所以仍然从文件头开始写,所以puzzle中的内容变为abc456,第三个echo就不再罗嗦一遍了,它是从6这个位置开始写操作的。

为什么cmd >file 2>&1这种模式就不会发生混乱呢?
就是因为2>&1,不是再打开一次文件,而是fd2照抄fd1,这两个fd共用一个foo结构,所以它们使用的fp也是同一个。

以下例子可以加深理解这个道理:

 
(echo -n 123;sleep 1;echo -n abcde >&2;sleep 1;echo -n 789) >puzzle 2>puzzle
结果:abc789


 
(echo -n 123;sleep 1;echo -n abcdeghij >&2;sleep 1;echo -n 789) >puzzle 2>puzzle
结果:abc789hij
阅读(412) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~