zoukankan      html  css  js  c++  java
  • 关于数据流重定向

    一、什么是数据流重定向

    要搞清楚数据流重定向,需要先搞清楚什么是数据流,然后如何重定向,这一切都需要从命令的执行过程说起。

    基本流程图副本

    如上图所示为命令的执行过程,可以看到,在Linux中,数据流分三种:标准输入(stdin)、标准输出(stdout)和标准错误(stderr)

    执行命令时,这个命令可能通过文件读入数据,处理后再将数据输出到屏幕,譬如:

    cat /etc/crontab /etc/notexist

    cat会由/etc/cronbtab和/etc/notexist读入数据,然后将数据输出到屏幕上,不过,因为不存在/etc/notexist这个文件,所以会显示错误消息,这个消息也打印到屏幕上。

    所谓的数据流重定向,就是将命令执行后应该要出现在屏幕上的数据,传输到其他地方,例如文件或者设备。而要把这些数据传送到别的地方,则需要用到传送命令。

    二、传送命令

    我们知道,要将默认输入到屏幕上的数据流重定向,需要传送命令,主要分为三种:

    1. 标准输入(stdin):代码为0,使用<或者<<

    2. 标准输出(stdout):代码为1,使用>或者>>

    3. 标准错误(stderr):代码为2,使用2>或者2>>

    总结来说,命令执行中重定向的方式如下:

    命令

    >

    1>

    >>

    2>

    2>>

    <

    设备或文件

    其中>和1>是一样的,因为标准输出代码是1,可以省略。

    三、具体用法

    1. 标准输出重定向

    例如,将ls –l 根目录的数据重定向到~/rootfile:

    ls -l / > ~/rootfile

    整个重定向的过程如下:

    (1)当文件(本例中的~/rootfile)不存在时,系统自动建立。

    (2)如果文件存在,则先把文件的内容清空,然后写入数据。

    如果不想清空原来的数据,而是想在原来的基础上累加,则需要使用>>,如:

    ls -l / >> ~/rootfile

    2. 标准错误重定向

    例如,我们cat一个不存在的文件:

    cat notexistfile
    提示:cat: notexistfile: No such file or directory

    如果我们要把这个错误输出,重定向,就可以这样:

    cat notexistfile 2> errorfile

    除了重定向的是标准错误外,它的重定向过程和>是一样的,当然如果想累加,就用2>>。

    3. 同时标准输入、输出重定向

    组合一下就行了,如:

    cat /etc/crontab  /etc/notexist > rightfile 2> errorfile

    特别的,如果要将数据输入同一个文件,这个时候不能这么写:

    cat /etc/crontab  /etc/notexist > errorfile 2> errorfile

    这条指令并不会提示错误,但是因为有两条数据流同时写入一个文件,会导致交叉写入,造成数据错乱,让文件的信息不可读,这个时候需要用到2>&1,表示将标准错误重定向到标准输出中去:

    cat /etc/crontab  /etc/notexist > errorfile 2>&1

    或者,使用更简洁的符号&>,上面的语句等价于:

    cat /etc/crontab  /etc/notexist &> errorfile

    4. 丢弃标准输入/错误的结果

    这个时候就需要用到 /dev/null 这个文件了,它相当于一个黑洞或者说垃圾桶,当重定向到这个文件时,所有信息都会消失不见:

    cat /etc/crontab  /etc/notexist > /dev/null 2>&1

    5. 标准输入重定向

    譬如,我们使用cat命令在键盘上输入数据,然后写入一个文件:

    cat > catfile
    this a file 
    <== 输完之后通过ctrl+d结束输入

    此时就有catfile产生,文件内容就是刚输入的内容,如果想通过其他文件来代替键盘输入,则可以:

    cat > catfile2 < catfile

    这就是<的用法,而<<的用法有点不一样,它表示“结束的输入字符”,例如我们想用cat将输入的消息输出到catfile中,且当输入EOF时,这次输出结束:

    cat > catfile <<EOF
    > this is a new input
    > EOF

    当输入EOF的时候就会自动结束输入,而不必使用ctrl+d来结束,注意的是EOF没有写入文件。

    四、使用场景

    1. 屏幕的输出很重要,需要保存到文件中。

    2. 后台执行的程序,不希望它干扰屏幕正常的输出结果。

    3. 一些系统的例行性命令如crontab的执行结果,希望它能保存下来。

    4. 一些执行命令,已经知道它可能的错误消息,想通过”2> /dev/null”直接丢掉。

    5. 错误消息和正确消息需要分别输出。

    五、参考

    《鸟哥的Linux私房菜_基础学习篇》(第二版)

    (完)

  • 相关阅读:
    每周一练 之 数据结构与算法(Tree)
    每周一练 之 数据结构与算法(Dictionary 和 HashTable)
    【CuteJavaScript】GraphQL真香入门教程
    每周一练 之 数据结构与算法(LinkedList)
    每周一练 之 数据结构与算法(Stack)
    每周一练 之 数据结构与算法(Set)
    每周一练 之 数据结构与算法(Queue)
    《JavaScript 正则表达式迷你书》知识点小抄本
    玩转CSS3(二)---CSS3实现瀑布布局
    玩转CSS3(一)----CSS3实现页面布局
  • 原文地址:https://www.cnblogs.com/harrymore/p/8760955.html
Copyright © 2011-2022 走看看