• Linux Shell编程(25)——I/O 重定向


    默认情况下始终有3个"文件"处于打开状态, stdin (键盘), stdout (屏幕), and stderr (错误消息输出到屏幕上). 这3个文件和其他打开的文件都可以被重定向. 对于重定向简单的解释就是捕捉一个文件, 命令, 程序, 脚本, 或者甚至是脚本中的代码块(参见 Example 3-1 和 Example 3-2)的输出, 然后将这些输出作为输入发送到另一个文件, 命令, 程序, 或脚本中.


    每个打开的文件都会被分配一个文件描述符. stdin, stdout, 和stderr的文件描述符分别是0, 1, 和 2. 对于正在打开的额外文件, 保留了描述符3到9. 在某些时候将这些格外的文件描述符分配给stdin, stdout, 或者是stderr作为临时的副本链接是非常有用的. 在经过复杂的重定向和刷新之后需要把它们恢复成正常的样子


    关闭文件描述符
    n<&-关闭输入文件描述符n.
    0<&-, <&-关闭stdin.
    n>&-关闭输出文件描述符n.
    1>&-, >&-关闭stdout.
    子进程继承了打开的文件描述符. 这就是为什么管道可以工作. 如果想阻止fd被继承, 那么可以关掉它.

    COMMAND_OUTPUT >
       # 重定向stdout到一个文件.
       # 如果没有这个文件就创建, 否则就覆盖.
    
       ls -lR > dir-tree.list
       # 创建一个包含目录树列表的文件.
    
    : > filename
       # > 会把文件"filename"截断为0长度.
       # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
       # : 是一个占位符, 不产生任何输出.
    
    > filename    
       # > 会把文件"filename"截断为0长度.
       # 如果文件不存在, 那么就创建一个0长度的文件(与'touch'的效果相同).
       # (与上边的": >"效果相同, 但是在某些shell下可能不能工作.)
    
    COMMAND_OUTPUT >>
       # 重定向stdout到一个文件.
       # 如果文件不存在, 那么就创建它, 如果存在, 那么就追加到文件后边.
    
       # 单行重定向命令(只会影响它们所在的行):
    
    1>filename
       # 重定向stdout到文件"filename".
    1>>filename
       # 重定向并追加stdout到文件"filename".
    2>filename
       # 重定向stderr到文件"filename".
    2>>filename
       # 重定向并追加stderr到文件"filename".
    &>filename
       # 将stdout和stderr都重定向到文件"filename".
    
       # 重定向stdout, 一次一行.
       LOGFILE=script.log
    
    
       echo "This statement is sent to the log file, "$LOGFILE"." 1>$LOGFILE
       echo "This statement is appended to "$LOGFILE"." 1>>$LOGFILE
       echo "This statement is also appended to "$LOGFILE"." 1>>$LOGFILE
       echo "This statement is echoed to stdout, and will not appear in "$LOGFILE"."
       # 每行过后, 这些重定向命令会自动"reset".
    
       # 重定向stderr, 一次一行.
       ERRORFILE=script.errors
    
       bad_command1 2>$ERRORFILE       #  错误消息发到$ERRORFILE中.
       bad_command2 2>>$ERRORFILE      #  错误消息添加到$ERRORFILE中.
       bad_command3                    #  错误消息echo到stderr,
                                       #+ 并且不出现在$ERRORFILE中.
       # 每行过后, 这些重定向命令也会自动"reset".
       #==============================================================================
    
    
    2>&1
       # 重定向stderr到stdout.
       # 得到的错误消息与stdout一样, 发送到一个地方.
    
    i>&j
       # 重定向文件描述符i 到 j.
       # 指向i文件的所有输出都发送到j中去.
    
    >&j
       # 默认的, 重定向文件描述符1(stdout)到 j.
       # 所有传递到stdout的输出都送到j中去.
    
    0< FILENAME
     < FILENAME
       # 从文件中接受输入.
       # 与">"是成对命令, 并且通常都是结合使用.
       #
       # grep search-word <filename
    
    [j]<>filename
       # 为了读写"filename", 把文件"filename"打开, 并且分配文件描述符"j"给它.
       # 如果文件"filename"不存在, 那么就创建它.
       # 如果文件描述符"j"没指定, 那默认是fd 0, stdin.
       #
       # 这种应用通常是为了写到一个文件中指定的地方.
       echo 1234567890 > File    # 写字符串到"File".
       exec 3<> File             # 打开"File"并且给它分配fd 3.
       read -n 4 <&3             # 只读4个字符.
       echo -n . >&3             # 写一个小数点.
       exec 3>&-                 # 关闭fd 3.
       cat File                  # ==> 1234.67890
       # 随机存储.
    
    |
       # 管道.
       # 通用目的的处理和命令链工具.
       # 与">"很相似, 但是实际上更通用.
       # 对于想将命令, 脚本, 文件和程序串连起来的时候很有用.
       cat *.txt | sort | uniq > result-file
       # 对所有的.txt文件的输出进行排序, 并且删除重复行,
       # 最后将结果保存到"result-file"中.


  • 相关阅读:
    json.stringify()和json.parse()
    C# 对json对象嵌套数组
    sql 时间段内没有的数据等于0
    epoint:TreeView
    Asp.Net使用org.in2bits.MyXls.dll操作excel的应用
    VS中的生成事件
    mysql主从复制
    mysql索引优化分析
    MySQL逻辑架构简介
    大数据DMP画像系统(转载 简介-龙果学院)
  • 原文地址:https://www.cnblogs.com/new0801/p/6176855.html
Copyright © 2020-2023  润新知