LinuxSir.cn,穿越时空的Linuxsir!

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

再问2>&1的问题

[复制链接]
发表于 2007-11-29 15:40:00 | 显示全部楼层 |阅读模式
在bash中执行命令
[root@localhost SRPMS]# rpmbuild --rebuild zsh-4.3.4-4.fc8.src.rpm
Installing zsh-4.3.4-4.fc8.src.rpm
error: Failed build dependencies:
        texi2html is needed by zsh-4.3.4-4.fc7.i386

然后执行:
[root@localhost SRPMS]# rpmbuild --rebuild zsh-4.3.4-4.fc8.src.rpm 1>err 2>&1
[root@localhost SRPMS]# more err
error: Failed build dependencies:
        texi2html is needed by zsh-4.3.4-4.fc7.i386
Installing zsh-4.3.4-4.fc8.src.rpm

请问如何在err中为什么顺序和重定向前不一样呢??应该如何才避免这等情况??
 楼主| 发表于 2007-11-30 09:16:42 | 显示全部楼层
怎么没人回复啊?谁能为我解惑啊
回复 支持 反对

使用道具 举报

发表于 2007-11-30 09:57:02 | 显示全部楼层
我觉得在重定向时,是先把错误写进了err中,这导致了顺序的不一致,

2>&1 我也一直都迷惑,今天查了一下资料,得出解释如下:
"2>&1" means "redirect standard error (2) to the same place as standard output (1.)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-30 10:19:11 | 显示全部楼层
那如何实现才能得到期待的结果呢??就是重定向按顺序写入err文件??
回复 支持 反对

使用道具 举报

发表于 2007-11-30 10:22:33 | 显示全部楼层
rpmbuild --rebuild zsh-4.3.4-4.fc8.src.rpm >err 2>&1
你试试这样行不行,我没有测试。。。
回复 支持 反对

使用道具 举报

发表于 2007-12-1 20:10:24 | 显示全部楼层
用这样如何
rpmbuild --rebuild zsh-4.3.4-4.fc8.src.rpm &>err
回复 支持 反对

使用道具 举报

发表于 2007-12-2 20:51:22 | 显示全部楼层
这种情况应该很难避免,在unix环境高级编程中是这样说的,ANSI C要求下列缓存特征:(1)当且仅当标准输入和标准输出并不涉及交互作用设备时,它们才是全缓存的。
(2)标准出错觉不会是全缓存的。在楼主所举的例子的输出中,由于标准输出的内容
较少,直到程序结束时,才会真正调用系统调用写入内核,然后写入文件,而标准出错
至少是行缓存的,所以会先于标准输出的内容出现在文件中。
回复 支持 反对

使用道具 举报

发表于 2007-12-28 13:35:15 | 显示全部楼层
因为:
在终端上,标准输出是行缓冲的,标准错误输出是不缓冲的
在文件上,标准输出是全缓冲的,标准错误输出是不缓冲的

由于缓冲方式的不同造成了输出方式的不同,在UNIX环境高级编程中有详细的说明


我曾经尝试这样:
cmd 2> err.log 1>&2

即把标准输出当作标准错误输出处理,强制文件IO不缓冲。
但是发现不能成功,本质上是因为文件是bash打开的,bash如果不改变文件的缓冲方式,就不能按设想的顺序输出,看了bash选项,没有可以改变重定向文件时缓冲方式的选项。
回复 支持 反对

使用道具 举报

发表于 2007-12-29 00:17:18 | 显示全部楼层
缓冲方式是由标准io库自己的事情,并不像fcntl调用系统掉用会影响到内核打开的实际文件,标准io库只是执行在用户空间,即使是bash设置了标准输出和标准出错的缓冲方式也不会有任何影响,因为如果bash执行了一个不是内置的命令的话,整个用户空间的内容都已经改变了。
回复 支持 反对

使用道具 举报

发表于 2007-12-29 13:56:27 | 显示全部楼层
刚才写了点测试程序,重新做了一下试验,明白了,原来如此
回复 支持 反对

使用道具 举报

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

本版积分规则

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