LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1020|回复: 12

关于极简单之重定向的一个很搞笑的问题

[复制链接]
发表于 2005-2-17 12:45:18 | 显示全部楼层 |阅读模式
先弄个干净的环境,比如我在/下建立一个文件夹test

我到test文件夹下,打ls,是不是什么都没?当然啦,空文件夹

那我又打  ls > abc  ,也就是把ls出来的内容写到abc里面去,那正常的顺序是先ls,然后把ls出来的内容再重定向

但是cat abc 后,里面的内容不是空的,而是已经有abc这行了

这说明什么?难道"ls > abc"时是先建立空abc文件,再ls,再写入到abc?

或者是bug?不可能有那么低级的bug吧?

谁来说说
发表于 2005-2-17 13:45:02 | 显示全部楼层
应该是要先大开袋子,才能放东西吧
没人更正?自己来,呵呵:
[HTML]ls |tee abc[/HTML]
回复 支持 反对

使用道具 举报

发表于 2005-2-17 21:26:11 | 显示全部楼层
应是先创建abc 再把 ls 的内容(已经有了abc)写入abc
回复 支持 反对

使用道具 举报

发表于 2005-2-18 14:20:59 | 显示全部楼层
[php]
hua@hua:~/tmp$ mkdir test
hua@hua:~/tmp$ cd test/
hua@hua:~/tmp/test$ ls
hua@hua:~/tmp/test$ ls > abc
hua@hua:~/tmp/test$ cat abc
abc
hua@hua:~/tmp/test$
[/php]

bash 跟 DOS/CMD 不同 , 重定向是同时进行的
回复 支持 反对

使用道具 举报

发表于 2005-2-18 17:37:13 | 显示全部楼层
对,也得小心这种问题:

sort sort.txt > sort.txt

由于重定向的同时性,sort.txt的内容将丢失。
回复 支持 反对

使用道具 举报

发表于 2005-2-19 13:27:09 | 显示全部楼层
到底是同时的还是有先后的?同时的情况下应该只有在并行CPU中的吧?我感觉还是有先后的,那位能解释清楚一下?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-19 14:08:01 | 显示全部楼层
我觉得这有点类似于先有鸡还是先有蛋一样复杂和有趣
回复 支持 反对

使用道具 举报

发表于 2005-2-19 20:57:01 | 显示全部楼层
在逻辑上是并行的,在实现上是串行的。因为必竞只有一个CPU(IA32)。
管道是这样实现的:
进程1                       系统文件句柄表           进程2
标准输出 ----->              映射        ----->      标准输入

显然两个进程必须同时存在。
进程1向进程2写入n(一般是4096b)个数据后暂停,等待进程2执行并处理,然后进程1醒过来继续。如是这个操作十分快的话(<10e-1秒)人类就会认为它们是并行的。

那么为什么sort sort.txt > sort.txt会失败呢?
首先sh启动sort的一个子进程和一个内部子进程(同时的),把sort的标准输出映射到内部子进程的输入上,然后不幸的是,">" 命令子进程以fp = fopen("sort.txt", "w");打开文件,所有sort.txt被盖了。而sort不会读出任何数据。
回复 支持 反对

使用道具 举报

发表于 2005-2-20 08:54:25 | 显示全部楼层
楼上说的很有道理,我同意,两个进程同时存在,轮流执行。
回复 支持 反对

使用道具 举报

发表于 2005-2-20 09:18:18 | 显示全部楼层
ls |tee abc
则abc里面没有abc文件列表;
这个应该怎么解释呢?
:thank
回复 支持 反对

使用道具 举报

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

本版积分规则

快速回复 返回顶部 返回列表