分享

">file 2>&1" 与 "2>&1 >file" 区别 '详解' - 技术文章 - ...

 jijo 2009-10-09
">file 2>&1" 与 "2>&1 >file" 区别 '详解'
看一直有人问这个问题,但是大家得到的关于解析顺序的答案 其实并不是事情的真相。
要理解两者真正的区别,先要理解一点基本概念:
"文件描述子和文件对象之间的关系"
"dup(2) dup2(2)两个系统调用的作用"

参考stevens大爷的优秀叙事风格之一"图解法",画了几个text图给大家,方便大家理解:
>newfile 2>&1
                                      +-----------------+
         +------------+       #------>| fileobj1 urtty  |
         |fd 0        +      /        +-----------------+
         |fd 1        +-----#         +-----------------+
         |fd 2        +-------------->| fileobj2 urtty  |
         .            .               +-----------------+
         .            .               +-----------------+
         |fd x        +-------------->| fileobjx newfile|
                                      +-----------------+
 >newfile dup2(fdx, fd1);
                                                 +-----------------+
         +------------+               close----->| fileobj1 urtty  |
         |fd 0        +                          +-----------------+
         |fd 1        +-----#         +-----------------+
         |fd 2        +------\------->| fileobj2 urtty  |
         .            .       \       +-----------------+
         .            .        \      +-----------------+
         |fd x        +---------#---->| fileobjx newfile|
                                      +-----------------+
 2>&1    dup2(fd1, fd2);
                                                 +-----------------+
         +------------+               close----->| fileobj1 urtty  |
         |fd 0        +                          +-----------------+
         |fd 1        +-----#                    +-----------------+
         |fd 2        +------\-#      close----->| fileobj2 urtty  |
         .            .       \ \                +-----------------+
         .            .        \ \    +-----------------+
         |fd x        +---------#-#-->| fileobjx newfile|
                                      +-----------------+
-----------------------------------------------------------------------
 2>&1 >newfile:
                                      +-----------------+
         +------------+       #------>| fileobj1 urtty  |
         |fd 0        +      /        +-----------------+
         |fd 1        +-----#         +-----------------+
         |fd 2        +-------------->| fileobj2 urtty  |
         .            .               +-----------------+
         .            .               +-----------------+
         |fd x        +-------------->| fileobjx newfile|
                                      +-----------------+
 2>&1 dup2(fd1, fd2);
                                      +-----------------+
         +------------+       #-#---->| fileobj1 urtty  |
         |fd 0        +      / /      +-----------------+
         |fd 1        +-----# /                  +-----------------+
         |fd 2        +------#        close----->| fileobj2 urtty  |
         .            .                          +-----------------+
         .            .               +-----------------+
         |fd x        +-------------->| fileobjx newfile|
                                      +-----------------+
 >newfile dup2(fdx, fd1);
                                      +-----------------+
         +------------+         #---->| fileobj1 urtty  | 引用计数不为0,不释放
         |fd 0        +        /      +-----------------+
         |fd 1        +---#   /                  +-----------------+
         |fd 2        +----\-#        close----->| fileobj2 urtty  |
         .            .     \                    +-----------------+
         .            .      \        +-----------------+
         |fd x        +-------#------>| fileobjx newfile|
                                      +-----------------+

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多