免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-12 05:48 |只看该作者 |倒序浏览
脚本a.sh的输出:
bbbb
aaaa

期望输出是:
aaaa
bbbb

该怎么修改,使重定向能正常工作?
  1. xsetlog()                                                                  
  2. {                                                                          
  3.     # Close STDOUT file descriptor                                         
  4.     exec 1<&-                                                              
  5.     # Close STDERR FD                                                      
  6.     exec 2<&-                                                              
  7.                                                                            
  8.     # Open STDOUT as $LOG_FILE file for read and write.                    
  9.     #exec 1<>$1                                                            
  10.                                                                            
  11.     # Open STDOUT as $LOG_FILE file for read.                              
  12.     exec 1>>$1                                                            
  13.                                                                            
  14.     # Redirect STDERR to STDOUT                                            
  15.     exec 2>>$1                                                            
  16. }                                                                          
  17. >a        
  18. xsetlog a                                                                  
  19.                                                                            
  20. ./a.out
复制代码
a.out 代码:
#include <stdio.h>
int main(  )
{
        fprintf( stdout, "aaaa\n" );
        fprintf( stderr, "bbbb\n" );
        return 0;

}

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
2 [报告]
发表于 2014-09-12 08:26 |只看该作者
默认情况下, stdout是有buffer, 而stderr是没有buffer.

你试着关闭stdout的buffer看看.

论坛徽章:
0
3 [报告]
发表于 2014-09-12 09:22 |只看该作者
q1208c 发表于 2014-09-12 08:26
默认情况下, stdout是有buffer, 而stderr是没有buffer.

你试着关闭stdout的buffer看看.


怎么关闭?

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
4 [报告]
发表于 2014-09-12 09:59 |只看该作者
#!/bin/sh
exec 1<&-
exec 2<&-

exec 1<>/tmp/a
exec 2<>/tmp/a
echo $1
echo $1

论坛徽章:
0
5 [报告]
发表于 2014-09-12 23:54 |只看该作者
bikong0411 发表于 2014-09-12 09:59
#!/bin/sh
exec 1


测试过,不行。

论坛徽章:
3
丑牛
日期:2014-09-13 18:19:22摩羯座
日期:2014-10-10 17:43:02水瓶座
日期:2014-10-16 01:00:22
6 [报告]
发表于 2014-09-13 02:42 |只看该作者
学生党:飘过~~**玩耍中~
[root@b10-1b opt]# (ll yhsafe.sh yhsafe.xn | tee) 3>&1 1>&2 2>&3 |(sync;tee)
-rwxr-xr-x. 1 root root 1168 May 31 00:15 yhsafe.sh
ls: cannot access yhsafe.xn: No such file or directory

说明:其实挺简单,借助第三个文件描述符,在C里面就fdopen搞出一个,3指向1 1指向2 2指向3 此时就是1是错误输出,2是标准输出,最后的sync一定要要,不然stdout缓冲区满了后才会输出,会出现一会儿好一会儿坏的情况,sync推动一下就不会出现这种情况了

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
7 [报告]
发表于 2014-09-14 15:16 |只看该作者
回复 5# jack9981


    我也是测试过的

论坛徽章:
0
8 [报告]
发表于 2014-09-14 21:27 |只看该作者
bikong0411 发表于 2014-09-14 15:16
回复 5# jack9981



#!/bin/sh
exec 1<&-
exec 2<&-

exec 1<>/tmp/a
exec 2<>/tmp/a
./a.out
用这个测试,echo测试不作数

论坛徽章:
13
双鱼座
日期:2013-10-23 09:30:05数据库技术版块每日发帖之星
日期:2016-04-20 06:20:00程序设计版块每日发帖之星
日期:2016-03-09 06:20:002015亚冠之塔什干火车头
日期:2015-11-02 10:07:452015亚冠之德黑兰石油
日期:2015-08-30 10:07:07数据库技术版块每日发帖之星
日期:2015-08-28 06:20:00数据库技术版块每日发帖之星
日期:2015-08-05 06:20:002015年迎新春徽章
日期:2015-03-04 09:57:09辰龙
日期:2014-12-03 14:45:52酉鸡
日期:2014-07-23 09:46:23亥猪
日期:2014-03-13 08:46:22金牛座
日期:2014-02-11 09:36:21
9 [报告]
发表于 2014-09-15 09:47 |只看该作者
回复 8# jack9981


sky➜  /tmp  ᐅ  ./c
aaaa
bbbb
sky➜  /tmp  ᐅ  cat 1.sh
#!/bin/sh
exec 1<&-
exec 2<&-

exec 1<>/tmp/a
exec 2<>/tmp/a
/tmp/c
sky➜  /tmp  ᐅ  bash 1.sh
sky➜  /tmp  ᐅ  tail /tmp/a
aaaa
p/c
bbbb

论坛徽章:
0
10 [报告]
发表于 2014-09-15 10:56 |只看该作者
回复 9# bikong0411

我的测试:

>cat c.c;                  
#include <stdio.h>
int main(  )
{
        fprintf( stdout, "aaaa\n" );
        fprintf( stderr, "bbbb\n" );
        fprintf( stdout, "cccc\n" );
        return 0;

}



>./a.out
aaaa
bbbb
cccc


>cat a.sh
#!/bin/sh
exec 1<&-
exec 2<&-

exec 1<>/tmp/a
exec 2<>/tmp/a
./a.out



>sh a.sh; cat /tmp/a
aaaa
cccc


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

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP