- 论坛徽章:
- 0
|
原帖由 woodie 于 2007-1-9 09:10 发表
我想这里的情况并不是遍历文件——对于我们的来说,那样做是没有意义的。不是吗?
如下面的sed和awk都在读入第10行后退出,绝不是要遍历整个文件。
{ sed '10q' <&3;cat <&3;} 3<tmp
{ awk ' ...
的确,我关于遍历的说法欠准确。
而且,我发现了我前面的一个观点是错误的:“sed和awk一定将文件指针置为文件尾”,特此声明。
用下面的方法测试
- seq 10000 >6
- exec 3<6
- strace awk 'NR==10{exit}' <&3
- cat <&3
- exec 3>&-
复制代码
关于标准输入的strace信息只有下面几句
- fstat64(0, {st_mode=S_IFREG|0644, st_size=48894, ...}) = 0
- ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbffc0368) = -1 ENOTTY (Inappropriate ioctl for device)
- fstat64(0, {st_mode=S_IFREG|0644, st_size=48894, ...}) = 0
- read(0, "1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14"..., 4096) = 4096
- exit_group(0) = ?
复制代码
它的文件指针在fd所指文件的4096字节!sed '10q'的信息及结果也是如此。
我上次使用的测试文件是个大小为21字节的文件,一次读4096字节碰巧已经seek到了文件尾。而当时我又没用strace仔细研究,因此错误得得出了上面那个观点。
又发现一个有趣的命令——tac
- exec 3<6
- cat <&3 >/dev/null
- tac <&3
- cat <&3
复制代码
它是迄今为止我发现的唯一一个可以逆转文件指针的shell命令,虽然其文件指针固定在了8192字节(小于8192字节的仍然定位于文件尾)
可惜这两个发现似乎没有什么实用性,姑且当兴趣研究吧~ |
|