Linux下输入输出重定向(2)

  ... 2>&1 运行一个命令并把它的标准输出和输出合并。(严格的说是通过复制文件描述符 1 来建立文件描述符 2 ,但效果通常是合并了两个流。)

  我们对 2>&1详细说明一下 :2>&1 也就是 FD2=FD1 ,这里并不是说FD2 的值 等于FD1的值,因为 > 是改变送出的数据信道,也就是说把 FD2 的 “数据输出通道” 改为 FD1 的 “数据输出通道”。如果仅仅这样,这个改变好像没有什么作用,因为 FD2 的默认输出和 FD1的默认输出本来都是 monitor,一样的!但是,当 FD1 是其他文件,甚至是其他 FD 时,这个就具有特殊的用途了。请大家务必理解这一点。

  exec 0exec 1>outfilename # 打开文件outfilename作为stdout。

  exec 2>errfilename # 打开文件 errfilename作为 stderr。

  exec 0<&- # 关闭 FD0。

  exec 1>&- # 关闭 FD1。

  exec 5>&- # 关闭 FD5。

1    COMMAND_OUTPUT >
  2      # 重定向stdout到一个文件.
  3      # 如果没有这个文件就创建, 否则就覆盖.
  4
  5      ls -lR > dir-tree.list
  6      # 创建一个包含目录树列表的文件.
  7
  8    : > filename
  9      # > 会把文件"filename"截断为0长度.
  10      # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
  11      # : 是一个占位符, 不产生任何输出.
  12
  13    > filename   
  14      # > 会把文件"filename"截断为0长度.
  15      # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
  16      # (与上边的": >"效果相同, 但是在某些shell下可能不能工作.)
  17
  18    COMMAND_OUTPUT >>
  19      # 重定向stdout到一个文件.
  20      # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
  21
  22
  23      # 单行重定向命令(只会影响它们所在的行):
  24      # --------------------------------------------------------------------
  25
  26    1>filename
  27      # 重定向stdout到文件"filename".
  28    1>>filename
  29      # 重定向并追加stdout到文件"filename".
  30    2>filename
  31      # 重定向stderr到文件"filename".
  32    2>>filename
  33      # 重定向并追加stderr到文件"filename".
  34    &>filename
  35      # 将stdout和stderr都重定向到文件"filename".
  36
  37      #==============================================================================
  38      # 重定向stdout, 一次一行.
  39      LOGFILE=script.log
  40
  41      echo "This statement is sent to the log file, \"$LOGFILE\"." 1>$LOGFILE
  42      echo "This statement is appended to \"$LOGFILE\"." 1>>$LOGFILE
  43      echo "This statement is also appended to \"$LOGFILE\"." 1>>$LOGFILE
  44      echo "This statement is echoed to stdout, and will not appear in \"$LOGFILE\"."
  45      # 每行过后, 这些重定向命令会自动"reset".
  46
  47
  48
  49      # 重定向stderr, 一次一行.
  50      ERRORFILE=script.errors
  51
  52      bad_command1 2>$ERRORFILE      #  错误消息发到$ERRORFILE中.
  53      bad_command2 2>>$ERRORFILE      #  错误消息添加到$ERRORFILE中.
  54      bad_command3                    #  错误消息echo到stderr,
  55                                      #+ 并且不出现在$ERRORFILE中.
  56      # 每行过后, 这些重定向命令也会自动"reset".
  57      #==============================================================================
  58
  59
  60
  61    2>&1
  62      # 重定向stderr到stdout.
  63      # 得到的错误消息与stdout一样, 发送到一个地方.
  64
  65    i>&j
  66      # 重定向文件描述符i 到 j.
  67      # 指向i文件的所有输出都发送到j中去.
  68
  69    >&j
  70      # 默认的, 重定向文件描述符1(stdout)到 j.
  71      # 所有传递到stdout的输出都送到j中去.
  72
  73    0< FILENAME
  74    < FILENAME
  75      # 从文件中接受输入.
  76      # 与">"是成对命令, 并且通常都是结合使用.
  77      #
  78      # grep search-word <filename
  79
  80
  81    [j]<>filename
  82      # 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
  83      # 如果文件"filename"不存在, 那么就创建它.
  84      # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
  85      #
  86      # 这种应用通常是为了写到一个文件中指定的地方.
  87      echo 1234567890 > File    # 写字符串到"File".
  88      exec 3<> File            # 打开"File"并且给它分配fd 3.
  89      read -n 4 <&3            # 只读4个字符.
  90      echo -n . >&3            # 写一个小数点.
  91      exec 3>&-                # 关闭fd 3.
  92      cat File                  # ==> 1234.67890
  93      # 随机存储.
  94
  95
  96
  97    |
  98      # 管道.
  99      # 通用目的的处理和命令链工具.
 100      # 与">"很相似, 但是实际上更通用.
 101      # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
 102      cat *.txt | sort | uniq > result-file
 103      # 对所有的.txt文件的输出进行排序, 并且删除重复行,
 104      # 最后将结果保存到"result-file"中.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/18463.html