当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 5 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : tee命令的小问题
帖子发表于 : 2010-08-14 23:54 

注册: 2009-08-26 20:04
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
运行命令
head foo.txt > foo.txt
会使foo.txt变成一个空文件。解决方法是:
head foo.txt | tee foo.txt
如何解释?


页首
 用户资料  
 
2 楼 
 文章标题 : Re: tee命令的小问题
帖子发表于 : 2010-08-15 0:33 
头像

注册: 2007-10-29 22:12
帖子: 5371
地址: 江苏南京
系统: OSX 10.9 + Ub 1304
送出感谢: 0 次
接收感谢: 6
文件改写的时机不同


_________________
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me


页首
 用户资料  
 
3 楼 
 文章标题 : Re: tee命令的小问题
帖子发表于 : 2010-08-15 9:58 
头像

注册: 2008-07-21 9:44
帖子: 2371
地址: 深圳
送出感谢: 0 次
接收感谢: 0 次
学习了 :em11


_________________

My blog


页首
 用户资料  
 
4 楼 
 文章标题 : Re: tee命令的小问题
帖子发表于 : 2010-08-15 20:28 

注册: 2009-08-26 20:04
帖子: 3
送出感谢: 0 次
接收感谢: 0 次
求详解


页首
 用户资料  
 
5 楼 
 文章标题 : Re: tee命令的小问题
帖子发表于 : 2010-08-15 22:21 
头像

注册: 2007-10-29 22:12
帖子: 5371
地址: 江苏南京
系统: OSX 10.9 + Ub 1304
送出感谢: 0 次
接收感谢: 6
head向stdio写入的时候,代码如下:
代码:

while (lines_to_write)
    {
      size_t bytes_read = safe_read (fd, buffer, BUFSIZ);
      size_t bytes_to_write = 0;

      if (bytes_read == SAFE_READ_ERROR)
        {
          error (0, errno, _("error reading %s"), quote (filename));
          return false;
        }
      if (bytes_read == 0)
        break;
      while (bytes_to_write < bytes_read)
        if (buffer[bytes_to_write++] == '\n' && --lines_to_write == 0)
          {
            off_t n_bytes_past_EOL = bytes_read - bytes_to_write;
            /* If we have read more data than that on the specified number
               of lines, try to seek back to the position we would have
               gotten to had we been reading one byte at a time.  */
            if (lseek (fd, -n_bytes_past_EOL, SEEK_CUR) < 0)
              {
                int e = errno;
                struct stat st;
                if (fstat (fd, &st) != 0 || S_ISREG (st.st_mode))
                  error (0, e, _("cannot reposition file pointer for %s"),
                         quote (filename));
              }
            break;
          }
      if (fwrite (buffer, 1, bytes_to_write, stdout) < bytes_to_write)
        error (EXIT_FAILURE, errno, _("write error"));
    }


而tee则是使用缓冲技术,写入的内容为缓冲区的值
fwrite (buffer, bytes_read, 1, descriptors[i]) != 1)

你可以造一个很大的txt文件,head 10000行,用tee你会看到得到的输出仍然小于你期望的值


_________________
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 5 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 4 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译