zoukankan      html  css  js  c++  java
  • Centos6笔记 -- 数据流重导向(Redirection)

    1. 数据流重导向的介绍  

      谈到数据流重定向,这里需要说明流的概念,就比如说我需要运行一个命令,就可能会有以下流的情况发生:

      

      在运行一个命令时,这个命令可能会由文件读入数据,经过处理之后,再将数据输出到屏幕上。 在上图当中, standard output 与 standard error output 分别代表标准输出与标准错误输出,这两个输出流默认都是输出到屏幕上面的。标准输出指的是命令运行所回传的正确的信息,而标准错误输出可理解为命令运行失败后,所回传的错误信息。

      如果我们希望这种输出流可以传送到其他的文件或装置区,那这个时候就使用到了数据流重导向功能;下面是传送所用的特殊字符:

      • 标准输入  (stdin) :代码为 0 ,使用 < 或 << 
      • 标准输出  (stdout):代码为 1 ,使用 > 或 >>
      • 标准错误输出(stderr):代码为 2 ,使用 2> 或 2>>

      比如:

    [root@www ~]# ll /  <==此时屏幕会显示出文件名信息
    
    [root@www ~]# ll / > ~/rootfile <==屏幕并无任何信息
    [root@www ~]# ll  ~/rootfile <==有个新档被创建,数据重新导向到了这个文件中
    -rw-r--r-- 1 root root 1089 Feb  6 17:00 /root/rootfile

      如果我又再次运行命令 ll /home > ~/rootfile ,那么上例中创建的rootfile中的内容会被覆盖掉,这里面文件的创建是有一定规则的:该文件 (本例中是 ~/rootfile) 若不存在,系统会自动的创建这个文件,但是当这个文件存在的时候,那么系统就会先将这个文件内容清空,然后再将数据写入,也就是若以 > 输出到一个已存在的文件中,那个文件就会被覆盖掉。如果想要将数据累加而不想要将旧的数据删除,则可以利用两个大于的符号 (>>) 。

      • 1> :以覆盖的方法将『正确的数据』输出到指定的文件或装置上;
      • 1>>:以累加的方法将『正确的数据』输出到指定的文件或装置上;
      • 2> :以覆盖的方法将『错误的数据』输出到指定的文件或装置上;
      • 2>>:以累加的方法将『错误的数据』输出到指定的文件或装置上;

      如果想将错误信息忽略掉而不显示或储存,这个时候可以使用黑洞装置 /dev/null 。这个 /dev/null 可以吃掉任何导向这个装置的信息。比如:

    将错误的数据丢弃,屏幕上显示正确的数据
    [dmtsai@www ~]$ find /home -name .bashrc 2> /dev/null
    /home/dmtsai/.bashrc  <==只有 stdout 会显示到屏幕上, stderr 被丢弃了

      如果要将正确与错误数据通通写入同一个文件,这个时候就得要使用特殊的写法:

    [dmtsai@www ~]$ find /home -name .bashrc > list 2>&1 <==使用特殊符号 2>&1
     [dmtsai@www ~]$ find /home -name .bashrc &> list <==或者使用这个特殊符号 &>

      standard input( < or << ) 简单说就是将原本需要由键盘输入的数据,改由文件内容来取代。

      先看下用 cat 命令操作来了解一下什么叫做键盘输入:

    [root@www ~]# cat > catfile
    testing
    cat file test
    <==这里按下 [ctrl]+d 来离开
    
    [root@www ~]# cat catfile
    testing
    cat file test

      我们再来看一下用某个文件的内容来取代键盘的输入:

    [root@www ~]# cat > catfile < ~/.bashrc
    [root@www ~]# ll catfile ~/.bashrc
    -rw-r--r-- 1 root root 194 Sep 26 13:36 /root/.bashrc
    -rw-r--r-- 1 root root 194 Feb  6 18:29 catfile

      我们再来理解一下 << 这个连续两个小于号的意思, 它代表的是结束的输入字符的意思。举例来讲:我要用 cat 直接将输入的信息输出到 catfile 中, 且当由键盘输入 eof 时,该次输入就结束,那我可以这样做:

    [root@www ~]# cat > catfile << "eof"
    > This is a test.
    > OK now stop
    > eof  <==输入这关键词,立刻就结束而不需要输入 [ctrl]+d
    
    [root@www ~]# cat catfile
    This is a test.
    OK now stop     <==只有这两行,不会存在关键词那一行!

    2. 命令运行的判断依据: ; , &&, ||

      在某些情况下,很多命令想要一次输入去运行,而不想要分次运行时,基本上我们有两个选择, 一个是 shell script 撰写脚本去运行,一种则是透过底下介绍的。

    2.1 cmd ; cmd (不考虑命令相关性的连续命令下达)

      在命令与命令中间利用分号 (;) 来隔开,这样一来,分号前的命令运行完后就会立刻接着运行后面的命令。这种运行命令的方式不管前一个命令是否正确运行了,后一个命令也会被执行的。

    2.2 $? (命令回传值) 与 && 或 ||

      如果需要考虑到两个命令之间的相依性(相依性主要判断的地方就在于前一个命令运行的结果是否正确), 这时就要透过这个命令回传值,命令回传值就是若前一个命令运行的结果为正确,在 Linux 底下会回传一个 $? = 0 的值。我们可以使用 && 及 || 来通过命令回传值来判断后续的命令是否需要执行。

    命令下达情况 说明
    cmd1 && cmd2

    1. 若 cmd1 运行完毕且正确运行($?=0),则开始运行 cmd2。

    2. 若 cmd1 运行完毕且为错误 ($?≠0),则 cmd2 不运行。

    cmd1 || cmd2

    1. 若 cmd1 运行完毕且正确运行($?=0),则 cmd2 不运行。

    2. 若 cmd1 运行完毕且为错误 ($?≠0),则开始运行 cmd2。

  • 相关阅读:
    在asp.net项目中使用winform窗口
    href="#"是什么意思呢? (转)
    在asp.net webservice中如何使用session(转载)
    ASP.NET 2.0 新追加控件ImageMap介绍(转)
    SEO是什么?
    推荐60个jQuery插件(转)
    asp.net webform 与asp.net mvc 混合开发项目总结
    获取SqlDataReader的列名
    梯度下降法 Method of steepest descent.
    蒙特卡洛算法
  • 原文地址:https://www.cnblogs.com/wy2185/p/5129437.html
Copyright © 2011-2022 走看看