Chinaunix首页 | 论坛 | 博客
  • 博客访问: 81327
  • 博文数量: 48
  • 博客积分: 1980
  • 博客等级: 上尉
  • 技术积分: 500
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-16 15:03
文章分类

全部博文(48)

文章存档

2009年(48)

我的朋友
最近访客

分类:

2009-09-17 19:06:52

I/O重定向综述
    默认情况下始终有3个"文件"处于打开状态, stdin(键盘), stdout(屏幕),stderr(错误消息输出到屏幕上).
    这3个文件和其他打开的文件都可以被重定向.
    对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者是脚本中的代码块的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中.
     每个打开的文件都会被分配一个文件描述符.  stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 除了这3个文件, 对于其他那些需要打开的文件, 保留了文件描述符3到9.
     在某些情况下, 将这些额外的文件描述符分配给stdin, stdout, 或stderr作为临时的副本链接是非常有用的.  在经过复杂的重定向和刷新之后需要把它们恢复成正常状态
 
 1.将stdout重定向到一个文件
      【格式】COMMAND_OUTPUT > filename
         # 将stdout重定向到一个文件. 
         # 如果这个文件不存在, 那就创建, 否则就覆盖. 
      【扩展】  : > filename
        # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 
        # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 
        # :是一个占位符, 不产生任何输出. 
      【扩展】    > filename    
        # >操作, 将会把文件"filename"变为一个空文件(就是size为0). 
        # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同). 
        # (与上边的": >"效果相同, 但是某些shell可能不支持这种形式.)
      【扩展】COMMAND_OUTPUT >> filename
       # 将stdout重定向到一个文件. 
       # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边. 

2.单行重定向命令(只会影响它们所在的行)
       【格式】文件描述符 > 文件名
       【扩展】1>filename
             # 重定向stdout到文件"filename".
       【扩展】1>>filename
             # 重定向并追加stdout到文件"filename". 
       【扩展】2>filename
             # 重定向stderr到文件"filename". 
       【扩展】2>>filename
             # 重定向并追加stderr到文件"filename". 
       【扩展】&>filename
             # 将stdout和stderr都重定向到文件"filename". 
      
       【扩展】M>N
             # "M"是一个文件描述符, 如果没有明确指定的话默认为1.
             # "N"是一个文件名.
             # 文件描述符"M"被重定向到文件"N". 
      
3.重定向到文件描述符
           【格式】M>&N
            # "M"是一个文件描述符, 如果没有明确指定的话默认为1.
            # "N"是另一个文件描述符. 
           【扩展】2>&1
           # 重定向stderr到stdout.
           # 将错误消息的输出, 发送到与标准输出所指向的地方. 
           【扩展】i>&j
           # 重定向文件描述符i到j. 
           # 指向i文件的所有输出都发送到j. 
          【扩展】>&j
              # 默认的, 重定向文件描述符1(stdout)到j. 
              # 所有传递到stdout的输出都送到j中去. 
4.其他
       【格式】0< FILENAME
              < FILENAME
              # 从文件中接受输入. 
              # 与">"是成对命令, 并且通常都是结合使用. 
       【格式】[j]<>filename
             # 为了读写"filename", 把文件"filename"打开, 并且将文件描述符"j"分配给它.
             #  如果文件"filename"不存在, 那么就创建它. 
             # 如果文件描述符"j"没指定, 那默认是fd 0, stdin. 

       【格式】|
            # 管道.
            # 通用目的处理和命令链工具.
            # 与">", 很相似, 但是实际上更通用.
            # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
            cat *.txt | sort | uniq > result-file
            # 对所有.txt文件的输出进行排序, 并且删除重复行.
            # 最后将结果保存到"result-file"中. 
 
5.关闭文件描述符
      【格式】n<&-
             关闭输入文件描述符n.
      【格式】0<&-, <&-
            关闭stdin.
      【格式】n>&-
            关闭输出文件描述符n.
      【格式】1>&-, >&-
             关闭stdout.
 
注意事项
[1] 一个文件描述符说白了就是文件系统为了跟踪这个打开的文件而分配给它的一个数字. 也可以的将其理解为文件指针的一个简单版本. 与C语言中文件句柄的概念很相似.
 
[2] 使用文件描述符5可能会引起问题. 当Bash使用exec创建一个子进程的时候, 子进程会继承fd5(参考Chet Ramey的归档e-mail, SUBJECT: RE: File descriptor 5 is held open). 最好还是不要去招惹这个特定的fd.
 
阅读(308) | 评论(0) | 转发(0) |
0

上一篇:here string 用法

下一篇:I/O重定向之exec

给主人留下些什么吧!~~