• 重定向与管道命令


    重定向

    “一切都是文件”是Linux的重要设计思想。Linux对于从键盘输入向屏幕输出以及向屏幕输出错误信息三个数据流分别定义为文件stdin, stdout, stderr。

    命令(可执行程序)从文件读取数据(包括stdin和数据文件、设备文件),向文件输出结果和错误信息(通常是屏幕)

    数据流重定向可以修改命令读取信息输出结果和错误信息的文件对象

    为何要使用重定向:

    • 当屏幕输出的信息很重要,而且我们需要将他存下来的时候;
    • 背景执行中的程序,不希望他干扰屏幕正常的输出结果时;
    • 一些系统的例行命令(例如写在 /etc/crontab 中的文件)的执行结果,希望他可以存下来时;
    • 一些执行命令,我们已经知道他可能的错误讯息,所以想以『 2> /dev/null 』将他丢掉时;
    • 错误讯息与正确讯息需要分别输出时。

    重定向符号

    >               输出重定向到一个文件或设备 覆盖原来的文件
    >!              输出重定向到一个文件或设备 强制覆盖原来的文件
    >>             输出重定向到一个文件或设备 追加原来的文件
    <               输入重定向到一个程序 

    标准错误重定向符号

    2>             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  b-shell
    2>>           将一个标准错误输出重定向到一个文件或设备 追加到原来的文件
    2>&1         将一个标准错误输出重定向到标准输出 注释:1 可能就是代表 标准输出
    >&             将一个标准错误输出重定向到一个文件或设备 覆盖原来的文件  c-shell
    |&              将一个标准错误 管道 输送 到另一个命令作为输入

    命令重导向示例:

    在 bash 命令执行的过程中,主要有三种输出入的状况,分别是:
    1. 标准输入;代码为 0 ;或称为 stdin ;使用的方式为 <
    2. 标准输出:代码为 1 ;或称为 stdout;使用的方式为 1>
    3. 错误输出:代码为 2 ;或称为 stderr;使用的方式为 2>

    [test @test test]# ls -al > list.txt
    将显示的结果输出到 list.txt 文件中,若该文件以存在则予以取代!


    [test @test test]# ls -al >> list.txt
    将显示的结果累加到 list.txt 文件中,该文件为累加的,旧数据保留!


    [test @test test]# ls -al  1> list.txt   2> list.err
    将显示的数据,正确的输出到 list.txt 错误的数据输出到 list.err


    [test @test test]# ls -al 1> list.txt 2> &1
    将显示的数据,不论正确或错误均输出到 list.txt 当中!错误与正确文件输出到同一个文件中,则必须以上面的方法来写!不能写成其它格式!

    [test @test test]# ls -al 1> list.txt 2> /dev/null
    将显示的数据,正确的输出到 list.txt 错误的数据则予以丢弃! /dev/null ,可以说成是黑洞装置。为空,即不保存。

    管道命令

    就如同前面所说的, bash 命令执行的时候有输出的数据会出现,那么如果这群数据必需要经过几道手续之后才能得到我们所想要的格式,应该如何来设定?这就牵涉到管线命令的问题了( pipe ),管线命令使用的是『 | 』。

    管道命令(pipe,FIFO)“ |”可以将前一个命令行的stdout数据作为第二个命令行的stdin输入,例如

    命令行1 | 命令行2 | 命令行n

    例子:简单的管线命令
    假设我们要读取 last 这个指令中,那个 root 登入的『次数』应该怎么作?
    那么我所进行的步骤是:
    1. 执行 last ,将所有这个月的所有人登入数据取出来;
    2. 使用 grep 将上面的输出数据(stdout)当中的 root 撷取出来,其它的不要;
    3. 使用 wc 这个可以计算行数的指令将上一步的数据计算行数!
    由于 last 的输出是一行代表一次登入,所以只要计算几行就代表登入几次的意思,经由上面三个步骤,将 last 数据逐步的筛选,就可以得到我们的数据了!整个命令可以写成如下: [test @test bin]# last | grep root | wc -l
    这个管线命令『 | 』仅能处理经由前面一个指令传来的正确信息,也就是standard output ( STDOUT ) 的信息,对于 stdandard error 并没有直接处理的能力。

  • 相关阅读:
    sqlserver 表操作 SQL篇
    C#知识点汇总
    DDL
    sqlserver2008简介
    面向对象继承
    IO文件流
    【帅刺猬课堂】Winform中使用WPF的UserControl
    KS Gantt甘特图控件通过递归加载无限层级的数据
    Office 每次打开需要重新配置的问题修复方法
    扩展方法
  • 原文地址:https://www.cnblogs.com/dear_diary/p/6805821.html
Copyright © 2020-2023  润新知